2015-12-21 163 views
22

在Dockerfile我有安装requirements.txt一个层:Docker只有在发生变化时才能运行pip requirements.txt?

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

当我建立搬运工图像它运行的全过程无论的这个文件的任何更改。

如何确保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)) 
+1

请发布'docker build'(和您的'Dockerfile')的输出。据推测,这是构建过程中的一个早期步骤,它正在破坏缓存,导致此步骤运行。 –

+0

更新OP与我目前拥有的所有 – Prometheus

+1

只是这一步没有用。请发布*完整*输出(或至少Dockerfile)。 –

回答

39

我假设在你的构建过程中的某个时刻,你与COPYADD复制你的整个应用程序到码头工人形象:

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... 

由于要求文件本身可能改变很少,您将可以使用缓存层,直到您将应用程序代码添加到图像中。

+1

作为一般指导,我相信'COPY'优先于'ADD',除非你特别需要ADD的行为。 – Metropolis

+0

@大都会,你完全正确。感谢提示。 – helmbert

+1

同意@Metropolis。只有''文件夹包含任何需要解压缩的档案或需要支持远程URL处理时才需要“ADD”。 [** {source code} **](https://github.com/docker/docker/blob/670c8696a29825b23208496bd4d8e88b5faa7773/builder/dispatchers.go#L77) – Mohsin

6

这是在多克自己的“Best practices for writing Dockerfiles”直接提到:

如果您有使用来自 您的上下文不同文件的多个Dockerfile步骤,将它们复制单独,而不是一下子。如果特别需要的文件改变,这个 将确保每个步骤的构建缓存仅失效(强制 该步骤重新运行)。

例如:

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

结果最少的cache废票的奔跑中,比如果你把 副本。/tmp /之前。

相关问题