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

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/*
    
  • 重新构建镜像并启动容器:
    docker-compose build && docker-compose up -d
    
    此时数据库会重新初始化,所有SQL脚本都会依次执行。

3. 使用专业数据库迁移工具(生产环境推荐)

依赖镜像初始化脚本的方式不适合迭代式的数据库变更,生产环境建议使用Flyway或Liquibase这类迁移工具:

  • 这类工具会维护一个迁移版本记录表,自动追踪已执行的脚本,每次应用启动时仅运行未执行过的新增脚本,不会丢失现有数据。
  • 可将迁移脚本集成到你的应用项目中,配置工具连接PostgreSQL,启动应用时自动执行迁移;也可在Docker Compose中单独配置迁移服务,依赖数据库容器完成脚本执行。

总结

不需要完全更换Docker Compose的实现方式,可根据场景选择方案:应急用手动执行,测试环境可重置数据卷,生产环境必须改用专业迁移工具来管理数据库版本迭代。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:35:26