Docker如何只在有变化的情况下运行pip requirements.txt?

pcww981p  于 12个月前  发布在  Docker
关注(0)|答案(3)|浏览(143)

在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))

7rfyedvj

7rfyedvj1#

我假设在构建过程中的某个时刻,您正在使用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...


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

goqiplq2

goqiplq22#

这在Docker自己的“Best practices for writing Dockerfiles“中直接提到:
如果您有多个Dockerfile步骤,使用来自您上下文的不同文件,请单独复制它们,而不是一次全部复制。这将确保每个步骤的构建缓存仅在特定所需文件更改时才会失效(强制重新运行该步骤)。
举例来说:

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

字符串
与将COPY . /tmp/放在RUN步骤之前相比,

ergxz8rk

ergxz8rk3#

或者,作为一种更快的方法来运行requirements.txt文件,而无需键入“yes”来确认库的安装,您可以重写为:

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

字符串

相关问题