django - 如何将静态文件从 django 容器暴露给 nginx
问题描述
我正在尝试从 django docker 容器中公开静态文件,以便全局(不在容器中)安装的 nginx 可以提供静态文件。重要的是我想使用 ansible 来做到这一点。
我尝试使用指向容器内公用文件夹的卷,但 docker 在运行容器时清除了此文件夹。
这是我的 Dockerfile:
FROM python:3.7-alpine
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /usr/src/app
ADD requirements.txt ./
RUN pip install -r requirements.txt
ADD . /usr/src/app
RUN python manage.py collectstatic --noinput
RUN python manage.py migrate
CMD gunicorn testdocker.wsgi -b 0.0.0.0:8000
静态根目录在 /usr/src/app/public
最后,nginx 应该服务于 docker 容器内的静态文件。
解决方案
Docker 是一种隔离机制,这意味着主机上的进程无法看到 Docker 容器内的文件。在主机和容器之间共享文件的各种机制通常支持以下用例:提供一个空目录来共享内容,或者将内容从主机推送到容器中,但不将容器文件取出。
解决此问题的最佳方法是设置您的 CI 系统以生成两组工件。一个是您在上面显示的 Docker 映像。另外,从原始源代码树开始,生成一组静态工件。一旦你有了这个工件包,将它部署到 nginx。
(换句话说,弄清楚如何在不涉及 Docker 的情况下解决这个问题,然后就这样做。)
(我可以想到其他两种方法来做到这一点:使用docker cp在容器启动后将内容从容器中复制出来,或者在容器内设置一个预启动脚本以将静态资产复制到某个绑定挂载的目录中。这两者都感觉更复杂,并且与这个非常具体的部署路径更相关。)
推荐阅读
- python - 如何匹配和合并熊猫数据框与列表?
- javascript - 我在 JavaScript 的上下文中不理解这个关键字
- ubuntu - Docker 容器创建由 root 拥有的目录,我需要它们由 1000:1000 拥有
- django - Django 客户模板标签在我的生产设置中不起作用
- java - 我的教授在 setter 中跳过了一个变量,他写的代码是不是有错误?
- python - 如果任何其他输入意味着出现问题,我应该如何结束 if-else 块?
- json - $ref 是什么意思?
- android - Inode 和已删除的文件条目
- powerbuilder - PowerBuilder - 重复值抑制列表不适用于某些数据窗口列
- javascript - vue js在元素上应用动画功能