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

Why is docker still running CMD when overridden in by docker run?

我有一个 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)")

但是,我认为没有必要这样做。在docker run命令中覆盖时docker执行CMD是否正常?我认为这应该是使用 CMDENTRYPOINT 之间的区别之一,您可以轻松覆盖 CMD 而无需使用 --entrypoint 标志。

以防万一,这是使用 docker 版本 17.03.0-ce

图像 运行 在某处定义了 ENTRYPOINT。如果您的 Dockerfile.

中没有图像,则可能在您正在构建的图像中 FROM

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

参数可以完全忽略,修改为入口点认为合适或者它可以将完整的命令传递给 运行。这种行为是特定于图像的。