我正试图在码头上弄脏手。我知道CMD
或ENTRYPOINT
用于指定docker image的start / runnable命令,而CMD
会覆盖ENTRYPOINT
。但是,我不知道,当父级码头图像也有CMD
或ENTRYPOINT
或两者兼有时,它是如何工作的?
子图像是否从父版本的docker图像继承这些值?如果是这样,那么父图像中的ENTRYPOINT
会覆盖子图像中的CMD
吗?
我知道https://github.com/docker/compose/issues/3140已经讨论过这样的问题了。但是,讨论相当陈旧(2 - 3年前)并且它没有清楚地回答我的问题。
提前致谢。
答案 0 :(得分:6)
如果您在子图片中定义ENTRYPOINT
,则会忽略this issue中标识的CMD
的值。目标是避免令人困惑的情况,即将入口点作为args传递给您不再想要运行的命令。
除了这种特定情况之外,ENTRYPOINT
和CMD
的值是继承的,可以由子映像甚至同一个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。