gpt4 book ai didi

python - 如何避免大型二进制文件在Dockerfile中的缓存无效(Python_Onbuild)

转载 作者:行者123 更新时间:2023-12-02 21:21:08 24 4
gpt4 key购买 nike

我要在我的ockfile中下载1.6 GB的二进制压缩文件,然后使用gunzip解压缩该文件,从而导致存储3.6 GB的文件。我不希望一直重复该过程,因为这会花费很多时间。它是一个静态文件,因此不应在每次使用Jenkins / docker将更改部署到服务器时下载。但是,每次下载它时,我都会提交更改,然后运行Jenkins进行部署。

这是我的docker文件:

FROM python:2.7.13-onbuild

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install --assume-yes apt-utils
RUN apt-get update && apt-get install -y curl
RUN apt-get update && apt-get install -y unzip
RUN curl -o - https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz \
| gunzip > /usr/src/app/GoogleNews-vectors-negative300.bin

更新:
我将扩展坞文件更改为一个简单的文件,如下所示:
FROM python:2.7.13-onbuild

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

RUN echo "Test Cache"

CMD /usr/local/bin/gunicorn -t 240 -k gevent -w 1 -b 0.0.0.0:8000 --reload src.wsgi:app

现在,如果我不更改代码或任何其他文件,则可以正常工作,因此不会重复执行命令echo "test cache"。但是,一旦我对源文件夹中的任何文件进行了任何更改,就会重复执行以下步骤后的所有命令,我认为这会将我的源代码复制到docker目录中。在此阶段不应该发生这种情况,因为这意味着一旦执行任何提交,便会重复执行我的所有命令。

这是我不对代码进行任何更改并第二次运行构建时的输出:
Sending build context to Docker daemon  239.1kB
Step 1/6 : FROM python:2.7.13-onbuild
# Executing 3 build triggers...
Step 1/1 : COPY requirements.txt /usr/src/app/
---> Using cache
Step 1/1 : RUN pip install --no-cache-dir -r requirements.txt
---> Using cache


Step 1/1 : COPY . /usr/src/app
---> Using cache
---> 1911c6dc9fce

Step 2/6 : RUN mkdir -p /usr/src/app
---> Using cache
---> 4019b029d05c
Step 3/6 : WORKDIR /usr/src/app
---> Using cache
---> 1a99833e908c
Step 4/6 : RUN echo "Test Cache"
---> Using cache
---> 488a62aa1b09

这是我在其中对源文件之一进行单个更改的输出,您可以看到重复了“测试缓存”回显。
Sending build context to Docker daemon  239.1kB
Step 1/6 : FROM python:2.7.13-onbuild
# Executing 3 build triggers...
Step 1/1 : COPY requirements.txt /usr/src/app/
---> Using cache
Step 1/1 : RUN pip install --no-cache-dir -r requirements.txt
---> Using cache


Step 1/1 : COPY . /usr/src/app
---> 6fd1003e246a
Removing intermediate container f25a4d2910cf
Step 2/6 : RUN mkdir -p /usr/src/app
---> Running in ff324f381875
---> 3694086a2b6a
Removing intermediate container ff324f381875
Step 3/6 : WORKDIR /usr/src/app
---> 5f23ab9a15df
Removing intermediate container 0b0d796f97d0
Step 4/6 : RUN echo "Test Cache"
---> Running in 296d2f141015
Test Cache
---> f90c7708d9eb

最佳答案

我的所有命令都在重复,因为我使用python:2.7.13-onbuild作为基本镜像。它的docker-file看起来像这样:

FROM python:2.7

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD COPY requirements.txt /usr/src/app/
ONBUILD RUN pip install --no-cache-dir -r requirements.txt

ONBUILD COPY . /usr/src/app

当我将其用作基础镜像时,将在docker文件中的所有命令之前执行复制命令,并且每次我对源代码进行任何更改时,此复制命令都会更改上下文。

建议我直接使用Python:2.7作为基本镜像,这样我就可以更好地控制此复制操作。我的新docker-file如下,最后是copy命令,它解决了该问题。
FROM python:2.7

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install --assume-yes apt-utils
RUN apt-get update && apt-get install -y curl
RUN apt-get update && apt-get install -y unzip
RUN curl -o - https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz \
| gunzip > /usr/src/app/GoogleNews-vectors-negative300.bin

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

根据此 documentation,通常不建议使用Python_onbuild图像。

这种解释是受我对同一问题的另一个问题的回答的启发:
Which Python variant to use as a base image in dockerfiles?

关于python - 如何避免大型二进制文件在Dockerfile中的缓存无效(Python_Onbuild),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com