Docker-Compose部署Django项目:Nginx与Gunicorn静态文件缺失问题
Django静态文件无法加载问题修复
问题根源
- 静态文件收集路径与共享卷不匹配:
Django容器中collectstatic将文件写入/app/static(由settings.py里STATIC_ROOT = os.path.join(BASE_DIR, 'static')决定,BASE_DIR对应容器内的/app目录),但docker-compose中挂载的共享卷是static:/static,导致收集的静态文件并未进入共享卷,nginx访问/static/路径时自然找不到文件。 - 请求 fallback 到Gunicorn:
由于共享卷内无静态文件,nginx无法返回资源,请求会被转发到Gunicorn,因此Gunicorn日志出现Not Found。
修复步骤
1. 修改Django settings.py
将STATIC_ROOT直接指向容器内的共享卷路径:
STATIC_ROOT = '/static' STATIC_URL = '/static/'
修改后,collectstatic会将静态文件直接写入/static目录(即共享卷挂载点),确保nginx能访问到。
2. 保持docker-compose卷挂载配置
当前docker-compose的卷配置是正确的,无需修改:
marathon_gunicorn: volumes: - static:/static nginx: volumes: - static:/static
确保两个容器共享同一个static卷。
3. 重建并重启容器
执行以下命令清除旧卷并重新部署:
docker-compose down -v docker-compose build docker-compose up -d
-v参数会删除旧的static卷,避免残留的路径问题影响新部署。
验证方法
- 进入Gunicorn容器检查静态文件是否存在:
若能看到静态文件目录(如docker exec -it <你的gunicorn容器名> ls /staticcss、js),说明收集成功。 - 访问页面查看静态资源是否正常加载,同时检查nginx和Gunicorn日志是否再出现错误。
内容的提问来源于stack exchange,提问作者Thapelo Chimfwembe
相关产品推荐
相关产品推荐

