You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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,初始化脚本会重新运行并完成数据库创建与恢复流程

四、最终启动逻辑说明

修改完成后的启动流程:

  1. PostgreSQL容器首次启动,检测到数据目录为空,初始化默认postgres库
  2. 启动临时PostgreSQL服务,执行init.sh中的数据库创建与备份恢复操作
  3. 临时服务关闭,启动正式PostgreSQL服务
  4. 健康检查持续验证两个数据库的可用性,验证通过后,应用容器才会启动

这样既解决了初始化脚本的报错问题,又保证了应用容器只会在数据库完全准备好后才启动。

内容的提问来源于stack exchange,提问作者Stavros Koureas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:33:41