为什么apt-get update 要与apt-get install 在一起
看到很多 Dockerfile 都是把 apt-get update 和 apt-get install 寫在同一個(gè) RUN 指令中的
RUN apt-get update && apt-get install -y
package-bar
package-baz
package-foo
而不是
RUN apt-get update
RUN apt-get install -y
package-bar
package-baz
package-foo
只知道這樣寫在同一個(gè) RUN 中會(huì)減少 layer 層,縮減構(gòu)建鏡像的大小.
但看到有一些文章提到,只有寫在同一個(gè) RUN 中才會(huì)對(duì)后面的 apt-get install 生效,卻沒(méi)有細(xì)說(shuō)原因.
因此產(chǎn)生了一個(gè)疑惑,分開寫也應(yīng)該會(huì)對(duì)后面的 apt-get install 生效才對(duì)啊,因?yàn)殓R像的構(gòu)建是一層一層的,后面的層會(huì)基于前面的層.
也就是說(shuō),RUN apt-get update 會(huì)單獨(dú)構(gòu)建一層,并且會(huì)對(duì)后面 RUN apt-get install 的層產(chǎn)生作用才對(duì).
分析
假設(shè)有一個(gè)這樣的 Dockerfile
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl
構(gòu)建鏡像之后,所有的層都會(huì)在 Docker 的緩存中.
假設(shè)后來(lái)修改 apt-get install 添加額外的包
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y curl nginx
Docker 將初始和修改的指令視為相同,并會(huì)重用之前構(gòu)建的緩存.
因此,不會(huì)執(zhí)行 apt-get update,因?yàn)闃?gòu)建直接使用之前的緩存版本.
由于 apt-get update 沒(méi)有運(yùn)行,所以構(gòu)建安裝的 curl 和 nginx 包很可能是過(guò)時(shí)的版本.
所以,把 apt-get update 和 apt-get install 寫在同一個(gè) RUN 中以獲取最新版本的包,而且還減少了 layer 層.
總結(jié)
以上是生活随笔為你收集整理的为什么apt-get update 要与apt-get install 在一起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: w ndows7管理员密码,Window
- 下一篇: 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇