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

Docker Volume数据不持久:compose down后数据丢失问题求助

Docker Compose数据持久化问题排查与解决

问题现象

执行sudo docker compose up -d后提交的数据(SQLite文本、图片),在执行sudo docker compose down再重新up时全部丢失,但用docker compose start/stop操作时数据能正常保留。

核心原因

数据根本没写入你配置的持久化卷,而是存在容器临时可写层里,具体路径不匹配问题如下:

  1. 你的主机目录结构是./site/static、./site/db,通过Dockerfile的COPY . .指令,这些内容被复制到容器的/home/site/site/目录下,应用实际读写的路径是/home/site/site/db和/home/site/site/static。
  2. 但你在Dockerfile和compose.yaml中配置的持久化卷,挂载的是/home/site/db和/home/site/static——这两个目录和应用实际操作的路径完全不搭,导致数据只存在于容器自身的临时层,down删除容器时数据就被销毁,stop/start因为容器实体未被删除,所以数据暂时保留。

解决方法

方案一:调整卷挂载路径(推荐)

修改compose.yaml中的卷挂载路径,匹配应用实际使用的目录:

services:
  site:
    build: flask
    restart: always
    ports: 
      - '8081:8081'
    volumes:
      - site_db:/home/site/site/db  # 改为应用实际的数据库路径
      - site_static:/home/site/site/static  # 改为应用实际的静态文件路径
    command: gunicorn -w 1 -t 3 -b 0.0.0.0:8081 --chdir ./site main:app
volumes:
  site_db:
  site_static:

同时删除Dockerfile中的VOLUME /home/site/db /home/site/static指令——在compose已显式配置卷挂载的情况下,这条指令完全多余,还容易造成路径混淆。

方案二:调整应用代码路径

如果不想修改compose配置,可直接修改main.py中的数据库、静态文件存储路径,改为/home/site/db和/home/site/static,确保数据写入挂载的卷中。

注意事项

  • docker compose down默认不会删除命名卷(你配置的site_db、site_static),只有加-v参数才会删除卷数据,只要数据正确写入卷,down后再up数据会正常保留。
  • Dockerfile中的VOLUME指令仅用于声明容器内的持久化目录,若已通过compose显式挂载卷,建议删除该指令避免混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:20:43