【问题标题】:Why is docker still running CMD when overridden in by docker run?为什么当被 docker run 覆盖时,docker 仍在运行 CMD?
【发布时间】:2018-03-19 21:15:59
【问题描述】:

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

【问题讨论】:

    标签: docker docker-entrypoint


    【解决方案1】:

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

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

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

    【讨论】:

    • ENTRYPOINT 是在我正在构建的图像上定义的 FROM
    猜你喜欢
    • 2018-08-08
    • 2019-10-28
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多