鏡像的緩存特性-每天5分鐘玩轉 Docker 容器技術(14)

Docker 文本編輯器 Ubuntu Vi 科技優家 2017-05-16

上一節我們學習了鏡像的分層結構,今天討論鏡像的緩存特性。

Docker 會緩存已有鏡像的鏡像層,構建新鏡像時,如果某鏡像層已經存在,就直接使用,無需重新創建。

舉例說明。在前面的 Dockerfile 中添加一點新內容,往鏡像中複製一個文件:

root@ubuntu:~# ls ①

Dockerfile testfile

root@ubuntu:~#

root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile-2 .

Sending build context to Docker daemon 32.77 kB

Step 1 : FROM ubuntu

---> f753707788c5

Step 2 : RUN apt-get update && apt-get install -y vim

---> Using cache ②

---> 35ca89798937

Step 3 : COPY testfile / ③

---> 8d02784a78f4

Removing intermediate container bf2b4040f4e9

Successfully built 8d02784a78f4

① 確保 testfile 已存在。

重點在這裡:之前已經運行過相同的 RUN 指令,這次直接使用緩存中的鏡像層 35ca89798937。

③ 執行 COPY 指令。其過程是啟動臨時容器,複製 testfile,提交新的鏡像層 8d02784a78f4,刪除臨時容器。

在 ubuntu-with-vi-dockerfile 鏡像上直接添加一層就得到了新的鏡像 ubuntu-with-vi-dockerfile-2。

鏡像的緩存特性-每天5分鐘玩轉 Docker 容器技術(14)

如果我們希望在構建鏡像時不使用緩存,可以在 docker build命令中加上--no-cache參數。

Dockerfile 中每一個指令都會創建一個鏡像層,上層是依賴於下層的。無論什麼時候,只要某一層發生變化,其上面所有層的緩存都會失效。

也就是說,如果我們改變 Dockerfile 指令的執行順序,或者修改或添加指令,都會使緩存失效。

舉例說明,比如交換前面 RUN 和 COPY 的順序:

雖然在邏輯上這種改動對鏡像的內容沒有影響,但由於分層的結構特性,Docker 必須重建受影響的鏡像層。

root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile-3 .

Sending build context to Docker daemon 37.89 kB

Step 2 : COPY testfile /

---> bc87c9710f40

Removing intermediate container 04ff324d6af5

Step 3 : RUN apt-get update && apt-get install -y vim

---> Running in 7f0fcb5ee373

Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]

......

從上面的輸出可以看到生成了新的鏡像層 bc87c9710f40,緩存已經失效。

除了構建時使用緩存,Docker 在下載鏡像時也會使用。例如我們下載 httpd 鏡像。

鏡像的緩存特性-每天5分鐘玩轉 Docker 容器技術(14)

docker pull 命令輸出顯示第一層(base 鏡像)已經存在,不需要下載。

由 Dockerfile 可知 httpd 的 base 鏡像為 debian,正好之前已經下載過 debian 鏡像,所以有緩存可用。通過 docker history 可以進一步驗證。

鏡像的緩存特性-每天5分鐘玩轉 Docker 容器技術(14)

下一節我們學習如何調試 Dockerfile。

相關推薦

推薦中...