为什么docker在被docker run覆盖时仍然在运行CMD?

时间:2018-03-19 21:16:00

标签: docker docker-entrypoint

我有一个Dockerfile,其中CMD为最后一行

CMD ["/usr/local/myapp/bin/startup.sh", "docker"]

在启动期间针对docker镜像执行的脚本的一部分如下

# find directory of cacerts file in DOCKER_JAVA_HOME of container
DOCKER_CACERTS_DIR=$(dirname "$(docker run "$DOCKER_IMAGE_ID" find "$DOCKER_JAVA_HOME" -name cacerts)")

但是,这仍然会从我的Dockerfile执行CMD行。

我发现我可以通过更改脚本中的行来改变这种行为。

# find directory of cacerts file in DOCKER_JAVA_HOME of container
DOCKER_CACERTS_DIR=$(dirname "$(docker run --entrypoint find "$DOCKER_IMAGE_ID"  "$DOCKER_JAVA_HOME" -name cacerts)")

但是,我认为这不是必要的。在CMD命令中重写时,docker执行docker run是否正常?我认为这应该是使用CMDENTRYPOINT之间的差异之一,您可以在不使用CMD标记的情况下轻松覆盖--entrypoint

如果重要,则使用泊坞窗版本17.03.0-ce

1 个答案:

答案 0 :(得分:1)

正在运行的图像在某处定义了ENTRYPOINT。如果您FROM中没有Dockerfile,则可能正在构建ENTRYPOINT的图片中。

定义CMDCMD后,Docker会将ENTRYPOINT作为参数传递给ENTRYPOINT。从那里开始,由@if (ViewBag.TicketId > 0) { Html.Action("GetName", "Ticket", new { Area = "Ticket" }); } 可执行文件决定要做什么。

参数可以完全忽略,在入口点看起来适合时进行修改,或者可以传递完整的命令来运行。该行为是特定于图像的。