Dockercaching置换RUN指令
如果从Dockerfile构build一个映像,将排列2个RUN指令:
- 创build一个全新的图像(新的散列)相同的caching图层排列?
- 没有创build新映像,因为排列不会影响同一组RUN指令的内部版本。
RUN指令1取代RUN指令2
RUN指令2被RUN指令1取代
如果您将RUN指令置换,将创build一个新的图像。 这里是一个例子:
FROM alpine RUN echo abc RUN echo cdf
运行docker image build -t image1 .
然后排列RUN命令并运行docker image build -t image2 .
。 你会发现image1和image2有不同的ID。
鉴于这个最小的Dockerfile:
FROM busybox RUN echo text1 > file1 RUN echo text2 > file2
当你运行:
docker build . -t my-image docker inspect my-image
那么你会得到:
"RootFS": { "Type": "layers", "Layers": [ "sha256:08c2295a7fa5c220b0f60c994362d290429ad92f6e0235509db91582809442f3", "sha256:2ce4cb064fd2dc11c0b6fe08ffed6364478f6de0a1ac115d8aa01005b4c2921a", "sha256:b4f880ce3a2172db2a614faf516c172d1e205bbf293daaee0174c4a5bd93d5f3" ] }
现在再尝试排列的命令,build立和检查你得到的图像:
"RootFS": { "Type": "layers", "Layers": [ "sha256:08c2295a7fa5c220b0f60c994362d290429ad92f6e0235509db91582809442f3", "sha256:812b39039b60290f4aa193d8f8bf03fbd13020dd5cfa6e6638feb68dac72cf9c", "sha256:451c384fb837aa70e446a36d3571123144cb497a42819b7a30348e7d49b24a0b" ] }
注意:如果您的命令不修改文件系统,例如RUN echo text
您的映像将只有一个图层sha256:08c2295a7fa5c220b0f60c9943 62d290429ad92f6e0235509db91582809442f3
,表示空的FS。
结论:不仅创build了一个新的图像,而且还创build了新图层(即新图像不仅仅是现有图层的重新sorting列表)。 这可能是因为该图层不仅包含内容,还包含其父散列。
有关更多详细信息,请参阅http://windsock.io/explaining-docker-image-ids/ 。