首页 > 解决方案 > 如何将静态文件从 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 容器内的静态文件。

标签: djangodockernginxdockerfile

解决方案


Docker 是一种隔离机制,这意味着主机上的进程无法看到 Docker 容器内的文件。在主机和容器之间共享文件的各种机制通常支持以下用例:提供一个空目录来共享内容,或者将内容从主机推送到容器中,但不将容器文件取出。

解决此问题的最佳方法是设置您的 CI 系统以生成两组工件。一个是您在上面显示的 Docker 映像。另外,从原始源代码树开始,生成一组静态工件。一旦你有了这个工件包,将它部署到 nginx。

(换句话说,弄清楚如何在不涉及 Docker 的情况下解决这个问题,然后就这样做。)

(我可以想到其他两种方法来做到这一点:使用docker cp在容器启动后将内容从容器中复制出来,或者在容器内设置一个预启动脚本以将静态资产复制到某个绑定挂载的目录中。这两者都感觉更复杂,并且与这个非常具体的部署路径更相关。)


推荐阅读