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

如何禁止docker-compose up命令重新创建已存在的Docker容器

解决方案

你的问题核心是Postgres数据默认存储在容器内部的可写层,只要容器被重建,内部数据就会被清空,以下是可直接落地的解决方法:

  • 配置持久化命名卷(最根本的解决方案)
    修改你的docker-compose.yml文件,为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容器
    控制台执行启动命令时,若不需要修改Postgres配置,可以添加--no-recreate参数避免重建已有容器:
    # 全量启动所有服务,不重建任何已存在的容器
    docker-compose up --no-recreate
    # 仅启动除Postgres外的其他服务,不碰现有Postgres容器
    docker-compose up --no-recreate web redis celery
    
  • 修改Pycharm Docker Compose配置,避免误操作
    打开Pycharm运行配置编辑页,找到你的Docker Compose配置项:
    1. 将默认的启动命令修改为up --no-recreate,禁止Pycharm自动重建无配置变更的容器
    2. 也可以在服务列表中取消勾选Postgres,让Pycharm不管理该服务,你单独通过控制台启动Postgres容器即可
    3. 关闭Pycharm Docker设置中的「删除容器时同时删除卷」选项,防止误删容器时连带清除数据卷。
  • 兜底方案:独立管理Postgres容器
    如果你不想让Compose和Pycharm碰已经恢复好数据的Postgres,可以单独用docker run命令启动Postgres容器,仅在Compose配置中填写该独立容器的网络地址供其他服务连接即可,彻底隔离Postgres的生命周期和其他服务。

内容的提问来源于stack exchange,提问作者Ярига Олег

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:04