1

根据文档

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

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

4

1 回答 1

3

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 步骤,请重置标志。)

于 2019-01-20T12:17:10.993 回答