上一節咱們學習了鏡像的分層結構,今天討論鏡像的緩存特性。
docker
Docker 會緩存已有鏡像的鏡像層,構建新鏡像時,若是某鏡像層已經存在,就直接使用,無需從新建立。ubuntu
舉例說明。
在前面的 Dockerfile 中添加一點新內容,往鏡像中複製一個文件:vim
root@ubuntu:~# ls ①緩存
Dockerfile testfile學習
root@ubuntu:~#ui
root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile-2 ..net
Sending build context to Docker daemon 32.77 kB調試
Step 1 : FROM ubuntucode
---> f753707788c5get
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。
若是咱們但願在構建鏡像時不使用緩存,能夠在 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 1 : FROM ubuntu
---> f753707788c5
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 鏡像。
docker pull 命令輸出顯示第一層(base 鏡像)已經存在,不須要下載。
由 Dockerfile 可知 httpd 的 base 鏡像爲 debian,正好以前已經下載過 debian 鏡像,因此有緩存可用。經過 docker history 能夠進一步驗證。
下一節咱們學習如何調試 Dockerfile。