派生镜像时继承了哪些 Dockerfile 指令?

Ric*_*fer 10 docker dockerfile

假设我有两个 Dockerfile,用于创建带有各自标签的图像:

Dockerfile.A:

FROM some-image

...
EXPOSE 9000

ENTRYPOINT ["some-script.sh"]
Run Code Online (Sandbox Code Playgroud)

Dockerfile.B:

FROM A 

...
Run Code Online (Sandbox Code Playgroud)

当我运行镜像 B 时,容器是否也暴露了我在 中定义的端口Dockerfile.A,并运行在那里定义的入口点脚本?

更一般地说,除了文件系统层之外,哪些指令是从基础 Dockerfile 继承的?

Adi*_*iii 6

这些指令与系统文件一起从基本映像继承。

暴露

如果基础镜像EXPOSE 8080 9090 在 Dockerfile 中提到了这些端口,那么扩展 Dockerfile 就不需要暴露这些端口。但是之间有区别exposing and publish

环境评价

如果基础镜像有一些 ENV,test-a=abc那么扩展镜像就会有这些 ENV。

工作目录

如果基本图像已设置, "WorkingDir": "/root",则扩展图像将具有工作目录/root

维护者

MAINTAINER adiii 如果不覆盖,扩展图像将具有相同的作者。

标签

扩展图像将与基础图像具有相同的标签

在建

设计为通过扩展映像运行。

入口点

与基本映像中的入口点相同,除非您覆盖它。

CMD

扩展镜像和基础镜像有相同的CMD,只要不覆盖入口点指令,见下。

你可以试试看。

Dockerfile A

FROM node:8.16
MAINTAINER adiii
LABEL key=test
EXPOSE 8080 9090
ENV test-a=abc
WORKDIR /root
ENTRYPOINT /root
CMD ["npm", "run", "start"]
Run Code Online (Sandbox Code Playgroud)

现在构建docker镜像B

Dockerfile B

FROM a
Run Code Online (Sandbox Code Playgroud)

docker build -t b . 检查镜像 bdocker inspect b:latest你会看到上面的指令继承自基础镜像,因为 Dockerfile B 没有覆盖入口点指令。

如果扩展图像覆盖了入口点,文档CMD将重置为空值,并且必须根据需要重新定义。