Dockerfile 构建继承父镜像的 ENTRYPOINT 和 CMD
在 Docker 中,Dockerfile
是否继承其父映像的 ENTRYPOINT
和 CMD
,取决于 Dockerfile
的编写方式。以下是规则:
1. CMD
的继承
- 子镜像会继承父映像的
CMD
,但如果在子镜像的Dockerfile
中显式定义了新的CMD
,就会覆盖父映像的CMD
。 - 如果子镜像未指定
CMD
,则会保留父映像的CMD
。
2. ENTRYPOINT
的继承
- 子镜像也会继承父映像的
ENTRYPOINT
,但如果在子镜像的Dockerfile
中显式定义了新的ENTRYPOINT
,则会覆盖父映像的ENTRYPOINT 和 CMD
。 - 如果子镜像未定义
ENTRYPOINT
,父映像的ENTRYPOINT
会保留。
3. ENTRYPOINT
和 CMD
的关系
- 如果两个都定义,
CMD
的作用是为ENTRYPOINT
提供默认参数。 - 如果覆盖了
ENTRYPOINT
,父映像的CMD
可能失去作用,除非新的ENTRYPOINT
设计为支持这些参数。
这个行为在 kubernetes 的 yaml 中覆盖容器命令同样适用
此外 WORKDIR 命令也是遵守这个规则:
Dockerfile中的WORKDIR
指令在子镜像中也是会继承父镜像的。如果在父镜像中已经设置了WORKDIR
,那么在子镜像中,你不需要再显式地设置WORKDIR
,它将自动继承父镜像的工作目录。
然而,如果在子镜像中你重新设置了WORKDIR
,那么新的设置会覆盖父镜像的WORKDIR
指令。
简而言之:
- 继承:如果子镜像没有显式设置
WORKDIR
,它会继承父镜像的工作目录。 - 覆盖:如果子镜像中使用了
WORKDIR
,它会覆盖父镜像的设置。