为什么 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
是否正常?我认为这应该是使用 CMD
和 ENTRYPOINT
之间的区别之一,您可以轻松覆盖 CMD
而无需使用 --entrypoint
标志。
以防万一,这是使用 docker 版本 17.03.0-ce
图像 运行 在某处定义了 ENTRYPOINT
。如果您的 Dockerfile
.
中没有图像,则可能在您正在构建的图像中 FROM
当定义了ENTRYPOINT
和CMD
时,Docker会将CMD
作为参数传递给ENTRYPOINT
。从那里开始,由 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)")
但是,我认为没有必要这样做。在docker run
命令中覆盖时docker执行CMD
是否正常?我认为这应该是使用 CMD
和 ENTRYPOINT
之间的区别之一,您可以轻松覆盖 CMD
而无需使用 --entrypoint
标志。
以防万一,这是使用 docker 版本 17.03.0-ce
图像 运行 在某处定义了 ENTRYPOINT
。如果您的 Dockerfile
.
FROM
当定义了ENTRYPOINT
和CMD
时,Docker会将CMD
作为参数传递给ENTRYPOINT
。从那里开始,由 ENTRYPOINT
可执行文件决定要做什么。
参数可以完全忽略,修改为入口点认为合适或者它可以将完整的命令传递给 运行。这种行为是特定于图像的。