1. 程式人生 > 實用技巧 >005Docker學習__映象的快取特性

005Docker學習__映象的快取特性

簡介 Docker 會快取已有映象的映象層,構建新映象時,如果某映象層已經存在,就直接使用,無需重新建立。 內容回顧 在【004Docker學習_Dockerfile_build命令構建docker映象】的例項中,使用Dockerfile 構建,以centos:centos7.4.1708 作為base images的新映象centos-vim-file,新映象中在base images映象層之上添加了一層映象ID為cc0a0d552187的新映象層。

在這裡我們依然使用centos:centos7.4.1708作為base images,來製作新的映象

例項一 1、修改【003Docker學習_Dockerfile_build命令構建docker映象】中Dockerfile的內容
vim Dockerfile
Dockerfile檔案中的內容修改為
FROM centos:centos7.4.1708
RUN yum -y update && yum -y install vim
COPY testfile/
2、使用已修改後的Dockerfile,構建新的映象
[root@docker ~]# docker build -t centos-vim-file2 .
Sending build context to Docker daemon  50.18kB
Step 1/3 : FROM centos:centos7.4.1708
 ---> 9f266d35e02c
Step 
2/3 : RUN yum -y update && yum -y install vim ---> Using cache ---> cc0a0d552187 Step 3/3 : COPY testfile / ---> ce043618c466 Successfully built ce043618c466 Successfully tagged centos-vim-file2:latest
  • 確保 testfile 已存在,需要和Dockerfile在同級目錄下。
  • 標號7....重點在這裡:之前已經執行過相同的 RUN 指令,這次直接使用快取中的映象層 cc0a0d552187。
  • 標號8....執行 COPY 指令。其過程是啟動臨時容器,複製 testfile,提交新的映象層 ce043618c466,刪除臨時容器。

在 centos-vim-file映象上直接新增一層就得到了新的映象centos-vim-file2

從映象ID可以看出新建映象的前RUN層使用的映象層是【003Docker學習_Dockerfile_build命令構建docker映象】中新建映象中的映象

如果希望在構建映象時不使用快取,可以在docker build命令中加上--no-cache引數。

Dockerfile 中每一個指令都會建立一個映象層,上層是依賴於下層的。無論什麼時候,只要某一層發生變化,其上面所有層的快取都會失效。 也就是說,如果我們改變 Dockerfile 指令的執行順序,或者修改或新增指令,都會使快取失效。

例項二 交換前面 RUN 和 COPY 的順序 1、修改本文例項一中Dockerfile的內容
vim Dockerfile
Dockerfile檔案中的內容修改為
FROM centos:centos7.4.1708
COPY testfile/
RUN yum -y update && yum -y install vim
2、使用已修改後的Dockerfile,構建新的映象

雖然在邏輯上這種改動對映象的內容沒有影響,但由於分層的結構特性,Docker 必須重建受影響的映象層。從上面的輸出可以看到生成了新的映象層 RUN ac63e20bfca1和COPY 42ad470ec5a1,快取已經失效。