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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:39:18