我一直在玩创建docker文件和阅读文档,我想知道这个问题:在我的docker文件中添加EXPOSE命令是否添加了一个层?(如果它确实为什么我会关心/它在文件中的位置是否重要?)
我理解RUN,COPY和ADD创建图层,因为它们会更改文件系统.但是暴露只是将元数据添加到容器中,它是否会更改生成一个图层?
是的,Dockerfile中的每条指令都会为生成的图像生成一个新图层.
但是,通过创建的图层EXPOSE是空图层.也就是说,它们的大小是0字节.
虽然它们不会影响您的存储,但它们确实可以在构建或从注册表中提取/推送图像时利用层缓存.
理解图像层的好方法是使用该docker history命令.例如,给定以下Dockerfile:
FROM scratch
EXPOSE 4000
EXPOSE 3000
Run Code Online (Sandbox Code Playgroud)
做
docker build -t test/image .
如果你那么docker history test/image你会看到:
IMAGE CREATED CREATED BY SIZE COMMENT
ab9f435de7bc 4 seconds ago /bin/sh -c #(nop) EXPOSE 4000/tcp 0 B
15e09691c313 5 seconds ago /bin/sh -c #(nop) EXPOSE 3000/tcp 0 B
Run Code Online (Sandbox Code Playgroud)
如果切换EXPOSE语句的顺序并再次构建,则会看到图层缓存被忽略.
我意识到我可以自己测试一下。我发现添加 EXPOSE 不会添加新的文件系统层,但它确实添加了一个层,而且为缓存层创建 docker 文件的顺序也很重要。
基本上:每个命令都会创建一个新层,每个更改文件系统的命令都会创建一个文件系统层。
FROM ...
EXPOSE 80
COPY smthing .
Run Code Online (Sandbox Code Playgroud)
不同于:
FROM ...
COPY smthing .
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)
多次执行时(例如在开发环境中)。
在第一个示例中,EXPOSE命令被缓存,即使文件更改也不会执行smthing。如果某些文件发生变化,docker build只会重新执行此命令(其余部分从缓存中获取)。
在第二个例子中。如果smthing文件发生变化,EXPOSE命令也会被重建。(因为复制命令之后的所有内容都无效并在 上重新执行docker build)。
我是否会更改 EXPOSE 端口,第一种情况必须重新执行复制命令,而第二个示例则不需要。
但两者都会在文件系统层上产生完全相同的最终结果。
docker inspect imageName #shows the file system layer
docker history imageName #shows all the layers
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1392 次 |
| 最近记录: |