是否存在在 dockerfile 中声明多个 CMD 的真实用例?

Is there a real use case of declaring more than one CMD in the dockerfile?

根据doc

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

为什么一个会列出多个 CMD 指令?我真的不明白这个指南。这是否像 "hack" 因为它们 not/can 不对 docker 文件进行验证以抱怨定义了超过 1 个 CMD 指令,或者这是一个真实的用例?也就是说,在某些情况下,我们可以定义超过 1 个 CMD,但如果只执行最后一个,我们就可以了(那为什么之前定义了)?
有人可以解释一下吗?

一个Docker文件更像是一个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 作者,这似乎是一个足够合理的 "warning" 类型的消息并且它为它写一个拉取请求可能并不难。 (保留一个标志,记住您是否看到过 CMD;如果您看到 CMD 步骤,如果设置了标志,则发出警告,如果没有设置,则设置它;如果您看到 FROM 步骤,请重置标志。)