2016-02-26 60 views
1

According to the Docker documentation,docker build應緩存所有未更改的行。Dockerfile不一致緩存

問題是,即使我沒有更改我的Dockerfile或僅更改它的結尾,圖像也會從Dockerfile的起始位置或隨機位置中重建。其他時候緩存按預期工作。我沒有ADD命令。

我使用的建設我的形象的命令是docker build --tag=pineapple/orange .

輸出開始了,像這樣:

Step 1 : FROM centos:7 
---> 0f0be3675ebb 
Step 2 : MAINTAINER Dixie Chicks <[email protected]> 
---> Using cache 
---> 7669f54fc137 
Step 3 : RUN yum update &&  yum install -y epel-release &&  yum install -y wget      git      python-devel &&  wget "https://bootstrap.pypa.io/get-pip.py" &&  python get-pip.py 
---> Running in 92a8f1cff2db 
Loaded plugins: fastestmirror, ovl 
Determining fastest mirrors 
* base: centos.den.host-engine.com 
* extras: centos-mirror.jchost.net 
* updates: centos.chicago.waneq.com 
... [starts re-installing everything] 

是否構建緩存不明確的標籤工作?我可以使用什麼策略來弄清楚爲什麼會發生這種情況?

編輯:如果它有所不同,我一直在編輯PyCharm內的Dockerfile。

+0

我只看到一次運行。不一致意味着什麼? –

回答

2

我寧願一個Dockerfile的第一線隔離在自己的基地形象:

FROM centos 
MAINTAINER Dixie Chicks <[email protected]> 
RUN yum update && \ 
    yum install -y epel-release && \ 
    yum install -y wget \ 
        git \ 
        python-devel && \ 
    wget "https://bootstrap.pypa.io/get-pip.py" && \ 
    python get-pip.py 

我建立一個基本映像一次,然後我創建另一個Dockerfile從開始:

FROM myBaseImage 

這樣,我可以根據需要重新構建我的第二個Dockerfile,所有先決條件安裝在第一個映像中已經完成(並且從不重新編譯)。

0

緩存基於三角洲系統(差異)。

Yum更新和你的命令中的一些幾乎不會以相同的增量結束。所需要的是第三方回購爲該文件進行更新以成爲不同的散列。隨着軟件包的變化,最終的結果將會變得不同。

它基本上不能緩存。如果你有一套特定的軟件包來確保做VonC所說的並將其打包在一個必備的容器中,那麼你最好打賭一下。

當我這樣做時,這也使得我的操作方面感到高興,因爲我知道如果現在構建它,而現在7天后,我會得到相同的包。在您的示例中,如果您現在構建它並收到wget- {version a},則可以在將來再次構建它並獲取wget- {version b}。也許這個版本在旗幟或圖書館等方面有所不同,並且會導致連鎖反應,並且您的應用程序會根深蒂固地行爲。雖然罕見,但這並非不可能。

+0

yum對緩存的影響很好的解釋。 +1。我的答案中沒有。 – VonC

+0

我不認爲這是真的。 Docker文檔:「除了ADD和COPY命令之外,緩存檢查不會查看容器中的文件來確定緩存匹配。例如,在處理RUN apt-get -y update命令時,容器中更新的文件將會不被檢查以確定緩存命中是否存在,在這種情況下,只是命令字符串本身將用於查找匹配。「 – szxk

+0

您可能是對的,我已經看到一些錯誤票據來表明其不一致。然而,回顧最初的問題時,很難看出它應該被緩存。也許連續兩次運行的輸出可能會有幫助 –