我有一个带有以下CMD作为最后一行的Dockerfile

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标志。

如果很重要,请使用docker版本17.03.0-ce

最佳答案

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

定义了ENTRYPOINTCMD后,Docker会将CMD传递给ENTRYPOINT作为参数。从那里,由ENTRYPOINT可执行文件决定要做什么。

这些参数可以完全忽略,可以在入口点认为合适的情况下进行修改,也可以将完整的命令传递给运行。该行为是特定于图像的。

关于docker - 当被docker run覆盖时,为什么docker仍在运行CMD?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49372466/

10-16 22:48