Docker EXPOSE会创建一个新图层吗?

Joe*_*kes 7 docker dockerfile

我一直在玩创建docker文件和阅读文档,我想知道这个问题:在我的docker文件中添加EXPOSE命令是否添加了一个层?(如果它确实为什么我会关心/它在文件中的位置是否重要?)

文档中没有特别说明.

我理解RUN,COPY和ADD创建图层,因为它们会更改文件系统.但是暴露只是将元数据添加到容器中,它是否会更改生成一个图层?

gvi*_*ino 6

是的,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语句的顺序并再次构建,则会看到图层缓存被忽略.


Joe*_*kes 4

我意识到我可以自己测试一下。我发现添加 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)