如何在docker-compose中自动从PostgreSQL备份文件初始化数据库
自动完成PostgreSQL数据库初始化的解决方案
作为Docker新手,你可以利用PostgreSQL官方镜像自带的初始化机制来实现自动恢复备份,不用再手动执行复制和恢复命令,具体步骤如下:
1. 准备初始化脚本与备份文件
首先在你的项目根目录下创建一个db-init文件夹,把你的app_dump.bak备份文件放进去,然后在这个文件夹里创建一个restore.sh脚本,内容如下:
#!/bin/bash set -e # 利用容器环境变量执行备份恢复命令,避免硬编码 pg_restore --no-owner --no-privileges -d "$POSTGRES_DB" -U "$POSTGRES_USER" /docker-entrypoint-initdb.d/app_dump.bak
创建完成后,给脚本添加可执行权限:
chmod +x db-init/restore.sh
2. 修改docker-compose.yml配置
更新你的docker-compose.yml,给dbpostgresql服务添加挂载卷,把本地的初始化目录映射到容器的指定路径,同时建议添加数据持久化卷避免重复初始化:
version: "3" services: app: image: 'first-docker-image:latest' build: context: ./backend dockerfile: Dockerfile container_name: app depends_on: - dbpostgresql ports: - 8080:8080 # 补充Spring数据库连接配置,确保能访问容器内的PostgreSQL environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://dbpostgresql:5432/app_db - SPRING_DATASOURCE_USERNAME=appuser - SPRING_DATASOURCE_PASSWORD=admin dbpostgresql: image: postgres:12.9 container_name: dbpostgresql environment: - POSTGRES_USER=appuser - POSTGRES_PASSWORD=admin - POSTGRES_DB=app_db ports: - 5432:5432 volumes: # 挂载初始化脚本与备份文件目录,容器会自动执行其中的脚本 - ./db-init:/docker-entrypoint-initdb.d # 添加数据持久化卷,避免容器重启后重新初始化数据库 - postgres_data:/var/lib/postgresql/data # 定义全局数据卷,用于持久化PostgreSQL数据 volumes: postgres_data:
3. 关键说明与验证
- 初始化逻辑:PostgreSQL官方镜像会在容器第一次启动(且数据卷为空)时,自动执行
/docker-entrypoint-initdb.d/目录下的.sh、.sql等脚本,所以你的备份恢复只会执行一次,后续重启容器不会重复操作。 - 容器网络访问:Spring应用的数据库URL使用容器服务名
dbpostgresql作为主机名即可,Docker Compose会自动创建内部网络,容器之间可以通过服务名互相访问。 - 验证操作:运行
docker-compose up -d后,你可以通过docker logs dbpostgresql查看容器日志,找到类似"restore completed successfully"的信息,就说明备份已经自动恢复完成,此时API就能正常返回结果了。
内容的提问来源于stack exchange,提问作者user9131524
相关产品推荐
相关产品推荐

