如何让Docker Compose应用容器等待PostgreSQL完成数据库恢复后启动
解决PostgreSQL容器恢复数据库后再启动应用容器的问题
一、修复初始化脚本(init.sh)的错误
当前报错的核心原因是恢复数据前未创建目标数据库,修改init.sh内容如下:
# 先创建目标数据库(通过默认postgres库执行创建操作) createdb -U postgres managementreporting createdb -U postgres idams_new # 执行数据库备份恢复 pg_restore -v -c -U postgres -d managementreporting /managementreporting.sql pg_restore -v -c -U postgres -d idams_new /idams_new.sql
pg_restore无法自动创建不存在的数据库,必须提前调用createdb创建- 指定
-U postgres确保使用超级用户权限执行操作,避免权限不足问题
二、修正健康检查的拼写错误与验证逻辑
原健康检查中数据库名存在拼写错误(managementreporing少了字母t),同时建议同时校验两个目标数据库的可用性,修改Docker Compose中dataspace_postgres的healthcheck配置:
healthcheck: test: ["CMD-SHELL", "sh -c 'pg_isready -U postgres -d managementreporting && pg_isready -U postgres -d idams_new'"] interval: 10s timeout: 120s retries: 10
- 只有当两个数据库都能正常连接时,健康检查才会通过,确保应用启动时所有依赖的数据库都已完成恢复
三、确保初始化脚本触发执行
PostgreSQL官方镜像仅在数据目录为空时,才会执行docker-entrypoint-initdb.d下的脚本。如果之前已经启动过容器并生成了disk-postgres卷,需要先清理旧数据:
docker-compose down -v
之后执行docker-compose up -d,初始化脚本会重新运行并完成数据库创建与恢复流程
四、最终启动逻辑说明
修改完成后的启动流程:
- PostgreSQL容器首次启动,检测到数据目录为空,初始化默认postgres库
- 启动临时PostgreSQL服务,执行
init.sh中的数据库创建与备份恢复操作 - 临时服务关闭,启动正式PostgreSQL服务
- 健康检查持续验证两个数据库的可用性,验证通过后,应用容器才会启动
这样既解决了初始化脚本的报错问题,又保证了应用容器只会在数据库完全准备好后才启动。
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

