Docker 如何仅在发生更改时才运行 pip 需求 s.txt?

在 Dockerfile 中,我有一个安装 requirements.txt的图层:

FROM python:2.7
RUN pip install -r requirements.txt

当我构建 docker 映像时,它会运行对该文件所做的任何更改的整个流程 无论如何

如何确保 Docker 只在文件发生更改时运行 pip install -r requirements.txt

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
168252 次浏览

我假设在构建过程中的某个时刻,您使用 COPYADD将整个应用程序复制到 Docker 映像中:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

问题在于,每次将整个应用程序复制到映像中时,都会使 Docker 构建缓存失效。这也将使所有后续构建步骤的缓存失效。

为了防止这种情况,我建议在将整个应用程序添加到映像中之前,在单独的构建步骤中复制 只有 requirements.txt文件:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

由于需求文件本身可能很少更改,因此在将应用程序代码添加到映像中之前,您都可以使用缓存的层。

这一点在 Docker 自己的“ 编写 Dockerfiles 的最佳实践”中直接提到:

如果有多个 Dockerfile 步骤,这些步骤使用 你的上下文,复制他们个别,而不是一次全部。这 将确保每个步骤的构建缓存仅失效(强制 要重新运行的步骤)。

例如:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

与将 /tmp/之前的副本。

或者,为了更快地运行 requirements.txt文件而不用键入“ yes”来确认库的安装,您可以重写为:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .