Docker Media卷无法持久化数据:Django项目文件访问异常求助
Django媒体文件容器重启后丢失问题排查方案
1. 核对Django媒体路径配置
首先确认项目settings.py里的MEDIA_ROOT必须和Docker卷挂载的容器内路径完全一致:
# settings.py 正确配置示例 MEDIA_ROOT = '/media' MEDIA_URL = '/media/'
如果MEDIA_ROOT设为容器内其他路径(比如./media或/app/media),上传的文件会存在容器本地而非挂载的media卷中,容器重启后文件自然丢失。
2. 给Celery服务补上媒体卷挂载
你的Celery服务未挂载media卷,若后续有任务需要处理媒体文件会直接报错,即使当前管理面板上传用不到Celery,也建议补上:
修改docker-compose.yml的celery服务段:
celery: restart: always build: context: . command: celery -A main worker -P eventlet -c 100 -l INFO env_file: - env depends_on: - rabbitmq3 - django_gunicorn - postgres networks: - main volumes: - media:/media # 新增媒体卷挂载
3. 检查容器内媒体目录权限
Docker卷挂载后,/media目录的权限可能不允许Django进程读写。进入django_gunicorn容器检查:
# 替换为你的容器名称/ID docker exec -it <django_gunicorn_container_id> /bin/sh # 查看目录权限 ls -ld /media
如果权限不足,在项目Dockerfile中添加权限配置:
# 创建媒体目录并设置权限(根据你的运行用户调整) RUN mkdir -p /media && chmod 755 /media # 若使用特定用户运行Django,比如www-data: # RUN mkdir -p /media && chown -R www-data:www-data /media
4. 验证媒体卷实际存储内容
直接查看media卷的物理存储路径,确认文件是否真的保存在卷中:
# 查看media卷详情 docker volume inspect <你的项目前缀>_media # 进入输出中的Mountpoint路径查看文件 ls <Mountpoint值>/_data
如果重启后这里没有文件,说明Django未将文件写入卷,回到第一步重新核对MEDIA_ROOT。
5. 检查Nginx媒体文件路由配置
确保Nginx配置文件中正确映射媒体目录:
location /media/ { alias /media/; }
这一步主要解决前端访问404的情况,但如果后端报文件不存在,优先级低于前面几项。
内容的提问来源于stack exchange,提问作者Balizok
相关产品推荐
相关产品推荐

