【问题标题】:Is there a real use case of declaring more than one CMD in the dockerfile?是否有在 dockerfile 中声明多个 CMD 的真实用例?
【发布时间】:2019-06-14 00:04:21
【问题描述】:

根据doc

一个 Dockerfile 中只能有一个 CMD 指令。如果你列出 多个 CMD 则只有最后一个 CMD 生效。

为什么一个会列出多个CMD 指令?我真的不明白这个指导方针。这是否像“黑客”,因为他们没有/不能对 docker 文件进行验证以抱怨定义了超过 1 个 CMD 指令,或者这是一个真实的用例?即在某些情况下,我们可以定义超过 1 个 CMD,但如果只执行最后一个,我们就可以了(那么为什么要定义前一个)?
有人可以解释一下吗?

【问题讨论】:

    标签: docker dockerfile docker-container docker-build docker-run


    【解决方案1】:

    Dockerfile 更像是一个 shell 脚本,而不是一个已编译的程序。 Docker 读取每一行,执行该行中描述的操作,然后创建一个新层。

    这样的设置非常合理:

    # I am "node", a node.js base image:
    FROM ubuntu:18.04
    RUN apt-get blah blah install nodejs
    # By default on this base image just run "node"
    CMD ["node"]
    
    # I am an application-specific image based on node.js
    FROM node
    COPY ...
    # Override that default CMD
    CMD ["node", "./app.js"]
    

    在此设置中,最终图像中有两个 CMD 层,这没关系。

    我没有立即在https://github.com/moby/moby/issues 中看到对此效果的功能请求,但是,如果我是 Docker 作者,这似乎是一个足够合理的“警告”类型消息,编写一个可能并不难拉请求它。 (保留一个标志以记住您是否看到过 CMD;如果您看到 CMD 步骤,则在标志已设置时发出警告,如果未设置则设置它;如果您看到 FROM 步骤,请重置标志。)

    【讨论】:

    • 如果在您的具体示例中,此序列将如何变化,而不是 CMDENTRYPOINTapplication-specific image based on node.js 中的构建会中断吗?
    • ENTRYPOINT 也是如此;但还要注意resetting ENTRYPOINT also resets CMD 的特殊规则。 (对于例程“设置此容器所做的事情”设置,我倾向于使用 CMD 而不是 ENTRYPOINT。)
    • 在哪里?有一个非常明确的声明(反映这个问题)only the last ENTRYPOINT has an effect 并且有一个特定的 docker run --entrypoint option
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2020-07-09
    • 2013-02-04
    • 2019-06-04
    • 2012-07-06
    • 2012-03-16
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多