父子码头中的CMD是否被子码头图像中的CMD / ENTRYPOINT覆盖?

时间:2018-02-28 11:35:45

标签: docker containers docker-image

我正试图在码头上弄脏手。我知道CMDENTRYPOINT用于指定docker image的start / runnable命令,而CMD会覆盖ENTRYPOINT。但是,我不知道,当父级码头图像也有CMDENTRYPOINT或两者兼有时,它是如何工作的?

子图像是否从父版本的docker图像继承这些值?如果是这样,那么父图像中的ENTRYPOINT会覆盖子图像中的CMD吗?

我知道https://github.com/docker/compose/issues/3140已经讨论过这样的问题了。但是,讨论相当陈旧(2 - 3年前)并且它没有清楚地回答我的问题。

提前致谢。

2 个答案:

答案 0 :(得分:6)

如果您在子图片中定义ENTRYPOINT,则会忽略this issue中标识的CMD的值。目标是避免令人困惑的情况,即将入口点作为args传递给您不再想要运行的命令。

除了这种特定情况之外,ENTRYPOINTCMD的值是继承的,可以由子映像甚至同一个Dockerfile的后续步骤单独覆盖。在最后定义的值具有优先权的图像中,每个图像中只存在一个值。

答案 1 :(得分:2)

ENTRYPOINT不会覆盖CMD,它们只代表结果命令的一部分,并且存在使生活更轻松。每当启动容器时,进程1的命令被确定为ENTRYPOINT + CMD,因此通常ENTRYPOINT只是二进制文件的路径,CMD是该二进制文件的参数列表。 CMD也可以很容易地从命令行覆盖,所以,再一次,它只是让生活更轻松并使容器的行为就像常规二进制文件一样 - 如果你有man容器,你可以设置入口点到/usr/bin/man和cmd到man。因此,如果您只是启动容器,则docker将执行/usr/bin/man man,但如果您运行类似docker run man docker的内容,则生成的容器命令将为/usr/bin/man docker - 入口点保持不变,cmd更改,并且生成容器的结果命令只是一个简单的合并。

ENTRYPOINT和CMD都是从父图层(图像)继承的,除非重写,因此如果从图像X继承并重新定义CMD,您仍将具有相同的ENTRYPOINT ,反之亦然。但是,正如下面提到的@BMitch,更改子图像中的ENTRYPOINT将有效地重置CMD。