从 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
我想使用 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