1、docker鏡像的緩存特性是怎樣的?如何說明?
Docker 會緩存已有鏡像的鏡像層,構建新鏡像時,如果某鏡像層已經存在,就直接使用,無需重新創建。
root@richardo-docker01:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-with-vim-dockerfile-2 latest fa86e8214b98 2 days ago 272MB
centos-with-vim-dockerfile latest e99684eeca8a 2 days ago 272MB
centos-with-vim latest 0ec55bc57a3d 2 days ago 272MB
httpd latest 3dd970e6b110 4 weeks ago 138MB
centos latest 0d120b6ccaa8 3 months ago 215MB
hello-world latest bf756fb1ae65 10 months ago 13.3kB
root@richardo-docker01:~# ls
0d120b6ccaa8 Dockerfile Running
root@richardo-docker01:~# touch testfile
root@richardo-docker01:~# vim Dockerfile
root@richardo-docker01:~# docker build -t centos-with-vim-dockerfile-2 .
Sending build context to Docker daemon 14.85kB
Step 1/3 : FROM centos
---> 0d120b6ccaa8
Step 2/3 : RUN yum makecache && yum install -y vim
---> Using cache
---> e99684eeca8a
Step 3/3 : COPY testfile /
---> fa86e8214b98
Successfully built fa86e8214b98
Successfully tagged centos-with-vim-dockerfile-2:latest
root@richardo-docker01:~#
2、如果希望構建鏡像的時候不使用緩存?應該怎么做?
如果我們希望在構建鏡像時不使用緩存,可以在 docker build 命令中加上 --no-cache 參數。
3、什么情況下綁在會失效?
Dockerfile 中每一個指令都會創建一個鏡像層,上層是依賴於下層的。無論什么時候,只要某一層發生變化,其上面所有層的緩存都會失效。
也就是說,如果我們改變 Dockerfile 指令的執行順序,或者修改或添加指令,都會使緩存失效。
eg:交換前面 RUN 和 COPY 的順序
雖然在邏輯上這種改動對鏡像的內容沒有影響,但由於分層的結構特性,Docker 必須重建受影響的鏡像層。
root@richardo-docker01:~# cat Dockerfile
FROM centos
COPY testfile /
RUN yum makecache && yum install -y vim
root@richardo-docker01:~# docker build -t centos-with-vim-dockerfile-3 .
Sending build context to Docker daemon 15.36kB
Step 1/3 : FROM centos
---> 0d120b6ccaa8
Step 2/3 : COPY testfile /
---> 32568ab9551d
Step 3/3 : RUN yum makecache && yum install -y vim
---> Running in 3d10325475a8
CentOS-8 - AppStream 1.8 MB/s | 5.8 MB 00:03
CentOS-8 - Base 1.9 MB/s | 2.2 MB 00:01
CentOS-8 - Extras 13 kB/s | 8.6 kB 00:00
Last metadata expiration check: 0:00:01 ago on Mon Nov 16 01:26:25 2020.
Metadata cache created.
Last metadata expiration check: 0:00:04 ago on Mon Nov 16 01:26:25 2020.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-13.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-13.el8 AppStream 48 k
which x86_64 2.21-12.el8 BaseOS 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 238 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 616 kB/s | 48 kB 00:00
(3/5): which-2.21-12.el8.x86_64.rpm 433 kB/s | 49 kB 00:00
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm 1.5 MB/s | 1.4 MB 00:00
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm 1.7 MB/s | 6.3 MB 00:03
--------------------------------------------------------------------------------
Total 1.4 MB/s | 7.8 MB 00:05
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 66 kB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-12.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-13.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-13.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-15.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-15.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-13.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-13.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-13.el8.noarch 4/5
Verifying : which-2.21-12.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-15.el8.x86_64 vim-common-2:8.0.1763-13.el8.x86_64
vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
which-2.21-12.el8.x86_64
Complete!
Removing intermediate container 3d10325475a8
---> f41e704ce73b
Successfully built f41e704ce73b
Successfully tagged centos-with-vim-dockerfile-3:latest
4、除了構建的時候用緩存還有什么時候會用緩存?
除了構建時使用緩存,Docker 在下載鏡像時也會使用。例如我們下載 httpd 鏡像。
由 Dockerfile 可知 httpd 的 base 鏡像為 debian,正好之前已經下載過 debian 鏡像,所以有緩存可用。通過 docker history 可以進一步驗證。
https://mp.weixin.qq.com/s/aEi_-nm49EuFBecae4-Baw