You need to enable JavaScript to run this app. Digital Ocean部署Docker时docker-compose down清空MongoDB数据排查
优惠活动
大模型
产品
解决方案
定价
更多

Digital Ocean部署Docker时docker-compose down清空MongoDB数据排查

配置问题定位与修正

你当前的docker-compose配置没有正确实现预期的外部卷挂载逻辑,这是执行docker-compose down后数据库数据被清空的核心原因,具体问题如下:

核心配置错误

  • mongo服务的卷挂载与声明的外部卷完全脱节
    你在mongo服务的volumes段写的./mongodb:/data/db/是宿主机本地目录绑定挂载的标准写法,作用是把执行compose命令时所处项目目录下的./mongodb文件夹,映射到容器内的MongoDB数据目录。你在文件顶层声明的、标记为external: true的mongodb外部卷,没有被任何服务实际引用,属于完全无效的冗余配置——你之前手动用docker volume create命令创建的外部卷,从来没有被mongo容器使用过。
  • 数据丢失的直接成因
    如果你早期部署时没有配置任何数据持久化规则,MongoDB的所有数据都会写入mongo容器自身的可写存储层。执行docker-compose down时会默认删除compose管理的所有容器,存放在容器可写层的数据会随容器一起被清除,这就是你观察到执行down后数据库全空的根本原因。
    哪怕现在加上了./mongodb的绑定挂载,只要你移动项目目录、在其他路径下执行compose命令,绑定挂载的源路径就会发生变化,容器启动时会自动创建空目录作为挂载源,同样会出现看不到历史数据的情况。

修正方案

将mongo服务下的volumes配置段,从原来的:

volumes:
      - ./mongodb:/data/db/

修改为直接关联顶层声明的外部卷:

volumes:
      - mongodb:/data/db/

修改后compose会自动关联你提前创建的外部命名卷,将其挂载到MongoDB的数据存储目录,后续执行容器停止、重建、docker-compose down操作都不会清除存储在卷内的数据。

注意:修正配置后首次启动,如果你之前在项目目录的./mongodb文件夹里存储过历史数据,需要手动将这些数据迁移到对应的外部命名卷中,否则首次启动会加载全新的空数据库。

附带的潜在配置风险

你的app服务端口映射配置为80:5000,但对应的Dockerfile中仅声明了EXPOSE 3000,且未在启动命令中调整Express的监听端口。如果你的Express应用默认监听3000端口,当前的端口映射会导致公网80端口的流量无法转发到应用内部,出现网站访问不通的问题,建议核对应用实际监听端口后调整映射规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 12:15:02