我有一个带有以下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
是否正常?我认为这应该是CMD
和ENTRYPOINT
之间的区别之一,您可以轻松地覆盖CMD
而无需使用--entrypoint
标志。如果很重要,请使用docker版本
17.03.0-ce
最佳答案
正在运行的镜像在某处定义了ENTRYPOINT
。如果FROM
中没有一个,则可能是在图像中正在构建Dockerfile
。
定义了ENTRYPOINT
和CMD
后,Docker会将CMD
传递给ENTRYPOINT
作为参数。从那里,由ENTRYPOINT
可执行文件决定要做什么。
这些参数可以完全忽略,可以在入口点认为合适的情况下进行修改,也可以将完整的命令传递给运行。该行为是特定于图像的。
关于docker - 当被docker run覆盖时,为什么docker仍在运行CMD?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49372466/