如何禁止docker-compose up命令重新创建已存在的Docker容器
解决方案
你的问题核心是Postgres数据默认存储在容器内部的可写层,只要容器被重建,内部数据就会被清空,以下是可直接落地的解决方法:
- 配置持久化命名卷(最根本的解决方案)
修改你的docker-compose.yml文件,为Postgres服务添加持久化卷挂载,示例配置如下:
配置完成后第一次启动,你只需要恢复一次数据,后续哪怕Postgres容器被删除重建,卷内的数据会自动挂载到新容器,无需重复恢复转储。services: postgres: image: postgres:你当前使用的版本号 environment: # 保留你原有配置的POSTGRES_USER、POSTGRES_PASSWORD等环境变量不变 volumes: # 将Postgres默认的数据存储目录挂载到Docker命名卷 - postgres_data:/var/lib/postgresql/data # 其他原有端口、网络等配置全部保留 # 底部声明命名卷,Docker会在宿主机上独立维护该卷的存储,不受容器生命周期影响 volumes: postgres_data: - 调整启动参数,禁止自动重建Postgres容器
控制台执行启动命令时,若不需要修改Postgres配置,可以添加--no-recreate参数避免重建已有容器:# 全量启动所有服务,不重建任何已存在的容器 docker-compose up --no-recreate # 仅启动除Postgres外的其他服务,不碰现有Postgres容器 docker-compose up --no-recreate web redis celery - 修改Pycharm Docker Compose配置,避免误操作
打开Pycharm运行配置编辑页,找到你的Docker Compose配置项:- 将默认的启动命令修改为
up --no-recreate,禁止Pycharm自动重建无配置变更的容器 - 也可以在服务列表中取消勾选Postgres,让Pycharm不管理该服务,你单独通过控制台启动Postgres容器即可
- 关闭Pycharm Docker设置中的「删除容器时同时删除卷」选项,防止误删容器时连带清除数据卷。
- 将默认的启动命令修改为
- 兜底方案:独立管理Postgres容器
如果你不想让Compose和Pycharm碰已经恢复好数据的Postgres,可以单独用docker run命令启动Postgres容器,仅在Compose配置中填写该独立容器的网络地址供其他服务连接即可,彻底隔离Postgres的生命周期和其他服务。
内容的提问来源于stack exchange,提问作者Ярига Олег
相关产品推荐
相关产品推荐

