从 docker-compose 中的转储初始化数据库

Initialize database from dump inside docker-compose

我想使用 Docker 和 docker-compose 部署 Web 应用程序。首先,我只关注 PostgreSQL 数据库和 Spring 后端之间的交互。通过遵循一些教程,我最终得到了以下 docker-compose.

version: "3"
services:
 app:
  image: 'first-docker-image:latest'
  build:
   context: ./backend
   dockerfile: Dockerfile
  container_name: app
  depends_on:
    - dbpostgresql
  ports:
   - 8080:8080
 dbpostgresql:
  image: postgres:12.9
  container_name: dbpostgresql
  environment:
   - POSTGRES_USER=appuser
   - POSTGRES_PASSWORD=admin
   - POSTGRES_DB=app_db
  ports:
   - 5432:5432

后端目录中的 Docker 文件调用 jar 来启动我的 Spring 后端,并且工作正常。此外,还建立了与数据库 'app_db'.

的连接

剩下的唯一问题是这个数据库是空的,所以所有 API 调用都会出错,因为数据库中没有表或数据。但是我确实有一个 PostgreSQL 转储 (app_dump.bak),我想用它来初始化这个数据库。

为了解决我的问题,我可以 运行 docker-compose,在容器启动后,我像这样将数据转储复制到容器中。

sudo docker cp app_dump.bak <DOCKER_ID>:/app_dump.bak

在此之后我可以在容器内创建一个 shell 并通过

恢复转储
pg_restore --no-owner --no-privileges -d app_db -U appuser app_dump.bak

这样做之后,一切正常。我可以 API 调用后端并显示相应的结果。

我正在寻找一种在 运行ning docker-compose 时执行此过程(初始化数据库)的方法,因此在容器启动后不需要额外的步骤。有什么方法可以在 docker-compose 设置中指定此行为?

我是 Docker 的新手,因此非常感谢任何指点。

您可以指定一个初始化容器来装载您的文件和 运行 命令;

version: "3"
services:
  app:
    image: "first-docker-image:latest"
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: app
    depends_on:
      - dbpostgresql
    ports:
      - 8080:8080
  dbpostgresql:
    image: postgres:12.9
    container_name: dbpostgresql
    environment:
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=app_db
    ports:
      - 5432:5432
  dbpostgresql_init:
    image: postgres:12.9
    container_name: dbpostgresql_init
    command: pg_restore -h dbpostgresql --no-owner --no-privileges -d app_db -U appuser app_dump.bak
    volumes:
      - ./app_dump.bak:/app_dump.bak
    environment:
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=app_db
    depends_on:
      dbpostgresql:
        condition: service_started