2015-12-21 38 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 /之前。

相關問題