【问题标题】:Make static files from django's collecstatic part of Docker image从 Docker 映像的 django collectstatic 部分制作静态文件
【发布时间】:2020-08-26 11:09:50
【问题描述】:

我想在 Docker 映像中包含从 python manage.py collectstatic 生成的静态文件。

为此,我在Dockerfile 中添加了以下行

CMD python manage.py collectstatic --no-input

但由于它在中间容器中运行命令,因此生成的静态文件不存在 STATIC_ROOT 目录。我可以在构建日志中看到以下几行。

Step 13/14 : CMD python manage.py collectstatic --no-input
 ---> Running in 8ea5efada461
Removing intermediate container 8ea5efada461
 ---> 67aef71cc7b6

我想在图像中包含生成的静态文件。我该怎么做才能做到这一点?

更新(解决方案)

我使用的是 CMD,但我应该使用 RUN 命令来执行此任务,就像文档说的那样

The RUN instruction will execute any commands in a new layer on top of the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.

【问题讨论】:

    标签: django docker dockerfile django-staticfiles


    【解决方案1】:

    您需要将collectstatic 的输出复制到您的最终容器中。

    例如,我的 dockerfile 包含相同的概念(这不是完整的 dockerfile,只是相关部分)

    # Pull base image
    FROM python:3.7.7-slim-buster AS python-base
    
    COPY requirements.txt /requirements.txt
    
    WORKDIR /project
    RUN apt-get update && \
        apt-get -y upgrade && \
        pip install --upgrade pip && \
        pip install -r /requirements.txt
    
    FROM node:8 AS frontend-deps-npm
    WORKDIR /
    COPY ./package.json /package.json
    RUN npm install
    COPY . /app
    WORKDIR /app
    RUN /node_modules/gulp/bin/gulp.js
    
    
    FROM python-base AS frontend-deps
    COPY --from=frontend-deps-npm /app /app
    WORKDIR /app
    RUN python manage.py collectstatic -v 2 --noinput
    
    
    FROM python-base AS app
    COPY . /app
    COPY --from=frontend-deps /app/static-collection /app/static-collection
    

    【讨论】:

    • 是的,我正在做那部分。但是我们如何才能持久化中间容器的数据呢? collectstatic 命令的 -v 标志有什么作用?
    • -v 用于冗长。你可以忽略它。您正在将构建静态文件的容器中的数据复制到最终容器中,就像我在该 sn-p 的最后一行显示的那样?
    • 不,我将使用 nginx 映像将生成的静态文件从 collectstatic 复制到我的容器中以提供服务。为此,我打算使用COPY --from=shahrukh/learnup:web /var/www/learnup/static_cdn/ /var/www/static/ 但由于文件不持久,因此无法正常工作。请注意,我首先将构建的映像推送到 docker hub,然后尝试构建 nginx 映像。正确的做法是什么?
    • 按照我上面详述的流程进行操作将满足您的需求。我的 frontend-deps 容器确实 collectstatic 所以它包含你想要的东西。运行后,您需要将该数据复制到将使用它的容器中。所以最后构建你的 nginx 容器,添加静态文件,公开正确的端口并运行你的服务。
    • 我尝试了您的解决方案,将其分解为多阶段构建,但即使命令成功运行并且我的 COPY 语句也成功执行,我的静态文件夹仍然为空。
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 2016-03-22
    • 2018-11-19
    • 1970-01-01
    • 2013-01-06
    • 2020-10-07
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多