Docker Volume数据不持久:compose down后数据丢失问题求助
Docker Compose数据持久化问题排查与解决
问题现象
执行sudo docker compose up -d后提交的数据(SQLite文本、图片),在执行sudo docker compose down再重新up时全部丢失,但用docker compose start/stop操作时数据能正常保留。
核心原因
数据根本没写入你配置的持久化卷,而是存在容器临时可写层里,具体路径不匹配问题如下:
- 你的主机目录结构是
./site/static、./site/db,通过Dockerfile的COPY . .指令,这些内容被复制到容器的/home/site/site/目录下,应用实际读写的路径是/home/site/site/db和/home/site/site/static。 - 但你在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
相关产品推荐
相关产品推荐

