Docker生产环境下Django媒体文件未持久化保存到项目media目录问题
解决方案
核心原因是生产环境未给Django的media目录配置Docker持久化卷,容器销毁时目录内文件会同步丢失,按以下步骤修改即可:
- 第一步:修改
docker-compose-production.yml配置
首先在底部volumes节点新增媒体卷声明:
再修改volumes: static_volume: { } pgdata: { } media_volume: {} # 新增媒体文件专属持久卷backend服务的volumes配置,新增媒体卷挂载,路径与settings.py的MEDIA_ROOT保持一致:
最后修改backend: restart: unless-stopped build: context: . dockerfile: ./docker/backend/Dockerfile entrypoint: /code/docker/backend/wsgi-entrypoint.sh volumes: - .:/code - static_volume:/code/backend/server/django_static - media_volume:/code/backend/server/media # 新增媒体卷挂载 expose: - 8000 depends_on: - dbnginx服务的volumes配置,挂载媒体卷让Nginx可直接读取媒体文件,无需转发到Django处理:nginx: restart: unless-stopped build: context: . dockerfile: ./docker/nginx/Dockerfile ports: - 80:80 - 443:443 volumes: - static_volume:/code/backend/server/django_static - media_volume:/code/backend/server/media # 新增媒体卷挂载 - ./docker/nginx/production:/etc/nginx/conf.d - ./docker/nginx/certbot/conf:/etc/letsencrypt - ./docker/nginx/certbot/www:/var/www/certbot depends_on: - backend - 第二步:修改Nginx配置文件(对应
./docker/nginx/production目录下的.conf文件),新增media路径匹配规则:location /media/ { alias /code/backend/server/media/; expires 30d; # 可选配置,添加媒体文件缓存规则优化访问速度 } - 第三步:重启服务生效
执行命令docker compose -f docker-compose-production.yml up -d --build重建启动服务即可,后续媒体文件会持久保存在media_volume卷中,容器重建/销毁都不会丢失。
内容的提问来源于stack exchange,提问作者Zekarias Taye Hirpo
相关产品推荐
相关产品推荐

