2016-02-19 71 views
1

我對我看到的一些docker緩存行爲感到困惑。Docker緩存混淆

首先我做一個碼頭構建,然後將鏡像推送到一個存儲庫,然後我在本地刪除所有我的碼頭數據(我在OSX上的一個虛擬機上運行docker,因此我銷燬並重新創建VM) 。然後我拉出剛推入存儲庫的圖像。

現在,我對我的代碼做了任何改變,例如,在自述文件中添加一個換行符。當我運行docker構建時,沒有任何步驟被緩存。它從一開始就逐一運行所有步驟。

當然,我預計任何COPY .步驟都會失效,因爲我更新了代碼,但是甚至之前的步驟都是無效的。

爲什麼會發生這種情況?

UPDATE:

這裏是我的輸出(匿名位)。

有沒有命令行參數,這種情況發生的時候我就跑docker build .

Step 1 : FROM 123456.dkr.ecr.us-east-1.amazonaws.com/foo:0.1.1 0.1.1: foo d89e1bee20d9: Already exists 9e0bc8a71bde: Already exists 27aa681c95e5: Already exists a3ed95caeb02: Already exists 1f23dc7f328b: Already exists 7c5e36b70451: Already exists 0844dd833da6: Already exists 8017b7feecce: Already exists 0dd824b407cc: Already exists ecfa07005844: Already exists 697248412260: Already exists df6663ccf76d: Already exists Digest: sha256:823221727843f32d1a52879aa57e40e02f4db2b31a2344384fc0307fa85c2b52 Status: Downloaded newer image for 123456.dkr.ecr.us-east-1.amazonaws.com/foo:0.1.1 ---> b6b907685beb Step 2 : RUN curl https://example.com > /file ---> Running in 1f912826e4c8 OK

它說,它「下載新的形象」爲「foo」的基本圖像,會是其中問題是?正如你所看到的那樣,所有的圖層都已經存在了。所以奇怪的是,它認爲它已經下載了一個更新的圖像,也許這與下面的步驟沒有被緩存的原因有關?

+0

您使用的是什麼版本的docker? – saada

+0

@saada Docker 1.9.1,我使用的存儲庫是AWS ECR存儲庫,如果這有所幫助。 – danny

+0

使用Docker重複您的實驗1.10 – saada

回答

1

刪除虛擬機還會刪除從終端上拉出並構建的所有圖像。這包括緩存圖層。這是預期的行爲,因爲Docker實際上並未在主機(OS X)中運行。 Docker Engine實際上在虛擬機內部運行,並且您的Docker客戶機CLI正在通過API與Engine進行通信。將您的虛擬機視爲Docker服務器,將您的CLI視爲Docker客戶端。由於Docker Engine在虛擬機中運行,當刪除虛擬機時,存儲在虛擬機中的緩存圖層,拉出的圖像和所有其他數據將與虛擬機一起刪除。

+0

正確的我希望當我刪除虛擬機時刪除緩存層,但是之後我正在做一個'docker pull',並期待所有需要在那個時候拉取的緩存層。 – danny