Docker EXPOSE做了一个新层吗?

我一直在创造docker文件和阅读文档,我想知道这个问题:添加一个EXPOSE命令到我的docker文件添加一个图层? (如果这样做,为什么我会关心/它放在文件内的什么地方?)

在文档中没有特别说明 。

我知道运行,复制和添加创build层,因为他们改变文件系统。 但暴露只是简单地将元数据添加到容器,它是否会改变生成一个图层?

是的,Dockerfile中的每条指令都会为生成的图像生成一个新图层。

但是,通过EXPOSE创build的EXPOSE空的图层。 也就是说,它们的大小是0字节。

虽然它们不会影响存储方面,但它们可以在构build或从registry中提取/推送图像时利用图层caching。

理解图像层的一个好方法是使用docker history命令。 例如,给定以下的Dockerfile:

 FROM scratch EXPOSE 4000 EXPOSE 3000 

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 

如果您切换EXPOSE语句的顺序并重新构build,则会看到被忽略的图层caching。

所有的指令都会创build新的图层,但是不改变文件系统的指令会创build一个空的图层。

值得研究Docker的文件系统分层是如何工作的,您可以在这里或这里阅读关于AUFS的信息 。

文件系统上基本上新的层是由那些从它们下面的层改变的文件组成的,就像一堆差异文件。 因此,如果没有变化,就没有层面了。 大多…

Dockerfile中的每条指令都将创build一个图像层,但对于AUFS(在EXPOSE的情况下)该层将是空的(与下面的层之间没有区别)。

我意识到我可以自己testing这个。 我发现添加EXPOSE并不会添加一个新的文件系统层,但是它确实增加了一个图层,同样,您为caching图层创builddocker文件的顺序也无关紧要。

基本上:每个命令创build一个新层,每个改变文件系统的命令创build一个文件系统层。

 FROM ... EXPOSE 80 COPY smthing . 

不同于:

 FROM ... COPY smthing . EXPOSE 80 

多次执行时(比如在开发环境中)。

在第一个例子中, EXPOSE命令被caching,即使smthing文件改变也不会被执行。 如果某些文件发生变化, docker build只会重新执行这个命令(其余部分取自caching)。

在第二个例子中。 如果文件更改,EXPOSE命令也将被重build。 (因为拷贝命令之后的所有东西都是无效的,并在docker build上重新执行)。

我会更改EXPOSE端口的第一个案例将不得不重新执行复制命令,第二个例子不会。

但是两者都会导致完全相同的最终结果文件系统层。

 docker inspect imageName #shows the file system layer docker history imageName #shows all the layers