macOS下Docker Compose使用已删除文件创建Postgres卷的问题如何解决?
问题成因
- Postgres官方镜像的执行逻辑限制:
/docker-entrypoint-initdb.d目录下的SQL脚本只会在容器首次启动、对应数据卷完全为空时执行一次,后续只要数据卷中已经生成了数据库文件,无论你怎么修改本地脚本、调整挂载配置,都不会重新执行该目录下的脚本。 - Docker卷持久化特性:你首次启动带volume配置的容器时,Docker除了挂载你指定的本地sql目录,还会自动为Postgres服务创建匿名卷来持久化数据库的实际数据。哪怕你后续删除了compose中的本地挂载配置,只要这个匿名卷没有被删除,重启容器时都会复用卷里已经存在的旧数据,所以看起来就像还在执行旧的初始化脚本。
- 容器复用问题:如果你没有主动删除旧容器,
docker-compose up默认会复用已存在的旧容器,不会重新按新的compose配置创建容器,也会导致旧配置生效。
解决步骤
- 彻底清理旧容器和关联的卷
在你的compose文件所在目录执行以下命令,停止服务同时删除关联的所有卷:
docker-compose down -v
如果已经找不到原来的compose文件,也可以手动删除:
- 先找到旧的pgdb容器并删除:
docker rm -f pgdb
- 再查找Docker中未使用的匿名卷并删除(注意如果有其他需要保留的匿名卷不要执行这步,可以先执行
docker volume ls找到对应卷后单独删除):
docker volume prune
- 验证当前compose配置符合你的预期,确认不需要的volume挂载已经删除后,重新启动服务即可:
docker-compose up -d
此时Postgres会使用全新的空数据卷初始化,不会再出现旧的表和测试数据。
如果后续你修改了初始化脚本需要生效,也需要执行docker-compose down -v删除旧卷后再重启容器。
内容的提问来源于stack exchange,提问作者Paul Miranda
相关产品推荐
相关产品推荐

