docker - 当被docker run覆盖时,为什么docker仍在运行CMD?

标签 docker docker-entrypoint

我有一个带有以下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/

相关文章:

powershell - 如何将 PowerShell 脚本指定为 Docker 容器入口点?

docker - 在任何来源中都找不到ast-2.3.0

docker - 了解 docker compose 中的端口和链接

security - 访问构建 Dockerfile 所需的 secret /私有(private)文件?

docker - 为什么在docker run上将入口点设为echo时未设置env变量?

linux - 为什么一个 linux 命令在容器内运行但在 entrpoint.sh 中不起作用

bash - 没有连续重启就无法从脚本工作中获取任何Docker Entrypoint

docker - 为什么 docker-machine 显示一个空列表?

shell - 如何将文件从远程服务器的docker容器复制到本地机器

Docker Storm 集群示例