Docker环境下Django+NGINX仅加载部分静态文件问题求助
兄弟,太懂你卡五小时找不到头绪的憋屈了!咱们一步步拆解你这个“旧静态文件能加载、新的.js/.css不行”的问题:
先踩准Docker RUN命令的坑:你用
RUN执行collectstatic是在构建镜像的时候跑的!如果构建镜像之后你才把新的静态文件加到项目代码里,那镜像里根本没这些新文件啊!赶紧把collectstatic挪到容器启动时执行,比如写个启动脚本,或者直接在CMD里拼命令:CMD ["sh", "-c", "python manage.py collectstatic --noinput && python manage.py makemigrations && python manage.py migrate && gunicorn your_project.wsgi:application --bind 0.0.0.0:8000"]检查静态文件权限:新生成的静态文件可能权限不对,NGINX读不了。在Dockerfile里加一句,确保静态根目录权限正常:
RUN chmod -R 755 /path/to/your/static_root把
/path/to/your/static_root换成你Django里STATIC_ROOT配置的实际路径。核对Django和NGINX的静态路径配置:
确认Django的STATIC_ROOT和NGINX配置里指向的路径完全匹配。比如Django里设的是STATIC_ROOT = '/usr/src/app/staticfiles',那NGINX的location块得这么写:location /static/ { alias /usr/src/app/staticfiles/; expires 30d; }别搞混
root和alias!用root的话路径会自动拼接,很容易出错。排查Docker卷的干扰:如果你把静态目录挂载成了本地卷,可能卷里存的是旧文件,把新生成的静态文件覆盖了。先试试删掉相关卷再重启容器(记得备份重要数据),或者确认挂载的不是
STATIC_ROOT目录,而是项目的静态源目录(比如static/)。清NGINX或浏览器缓存:有时候NGINX会缓存静态文件的索引,导致新文件没被识别到。如果NGINX是单独的容器,直接重启它;或者在NGINX的静态location里加缓存失效配置,同时清理浏览器的缓存再测试。
内容的提问来源于stack exchange,提问作者user7761401

