Docker Compose中PostgreSQL容器未执行新增SQL脚本的问题
PostgreSQL容器新增SQL脚本未执行的问题解决
问题原因
PostgreSQL官方镜像的/docker-entrypoint-initdb.d/目录下的初始化脚本,仅在数据库首次初始化(即数据目录/var/lib/postgresql/data为空)时执行一次。你当前通过./data:/var/lib/postgresql/data挂载了宿主机目录作为数据卷,第一次启动容器后该目录已生成数据库数据,后续即使新增SQL脚本并重新构建镜像、重启容器,只要数据卷内容未清空,初始化脚本就不会再次运行,这就是version3.sql未执行的原因。
解决方案
1. 临时手动执行(应急场景)
直接进入容器执行新增的SQL脚本:
- 进入PostgreSQL容器:
docker-compose exec app-db bash - 登录目标数据库:
psql -U test tm - 执行
version3.sql脚本:\i /docker-entrypoint-initdb.d/version3.sql
2. 重置数据卷(测试环境适用)
此方法会清空现有数据库数据,仅适合测试或可重新导入数据的场景:
- 停止并移除容器:
docker-compose down - 删除宿主机数据卷目录内容:
rm -rf ./data/* - 重新构建镜像并启动容器:
此时数据库会重新初始化,所有SQL脚本都会依次执行。docker-compose build && docker-compose up -d
3. 使用专业数据库迁移工具(生产环境推荐)
依赖镜像初始化脚本的方式不适合迭代式的数据库变更,生产环境建议使用Flyway或Liquibase这类迁移工具:
- 这类工具会维护一个迁移版本记录表,自动追踪已执行的脚本,每次应用启动时仅运行未执行过的新增脚本,不会丢失现有数据。
- 可将迁移脚本集成到你的应用项目中,配置工具连接PostgreSQL,启动应用时自动执行迁移;也可在Docker Compose中单独配置迁移服务,依赖数据库容器完成脚本执行。
总结
不需要完全更换Docker Compose的实现方式,可根据场景选择方案:应急用手动执行,测试环境可重置数据卷,生产环境必须改用专业迁移工具来管理数据库版本迭代。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

