Dockerfile 中是否需要提及 CMD 或 ENTRYPOINT?

Ash*_*ani 7 docker dockerfile

我已阅读有关 CMD 和 ENTRYPOINT 的文档

https://docs.docker.com/engine/reference/builder/#entrypoint

在这里,他们在表中提到“不允许使用 CMD 和 NO ENTYRPOINT”,但是我创建了一个没有 CMD 和 ENTRYPOINT 的 Dockerfile,并且镜像构建成功。下载高山焦油从这里高山焦油

文件

from scratch 
ADD alpine-minirootfs-3.11.2-x86_64.tar.gz /
COPY . /
Run Code Online (Sandbox Code Playgroud)

构建图像:

docker build -t test:1 .
Sending build context to Docker daemon  2.724MB
Step 1/3 : from scratch
-----
Successfully tagged test:1

docker run -ti test:1 /bin/sh
/ # 
Run Code Online (Sandbox Code Playgroud)

有效!!那么为什么在文档中提到 CMD 或 ENTRYPOINT 是必要的?

Sha*_*k V 10

文档中的以下行不正确。

Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
Run Code Online (Sandbox Code Playgroud)

大概应该说——

CMD or ENTRYPOINT is necessary for running a container.

  • 该文档使用“应该”,不要与“必须”混淆。如果基础镜像中有 CMD 和/或 ENTRYPOINT(包括文档中详细说明的可能的默认值),则没有义务添加它,除非您需要覆盖它。 (3认同)
  • 这就是混乱所在,没有必要有 CMD 或 ENTRYPOINT。表中的说法是错误的。 (3认同)

Dav*_*aze 6

docker run命令行的末尾指定一个命令提供(或覆盖)CMD;同样,该docker run --entrypoint选项提供(或覆盖)ENTRYPOINT. 在您的示例中,您给出了一个命令,/bin/sh因此容器可以执行某些操作;如果你离开它,你会得到一个错误。

作为样式问题,您的 Dockerfiles 几乎总是声明一个CMD,除非您要扩展已经自动运行应用程序的基本映像 ( nginx, tomcat)。这将使您能够docker run获得图像并启动嵌入其中的应用程序,而无需记住更具体的命令行调用。

  • 您在表格中的位置有一个“CMD”,它是命令行中的“/bin/sh”。 (3认同)
  • 在 [了解 CMD 和 ENTRYPOINT 如何交互](https://docs.docker.com/engine/reference/#understand-how-cmd-and-entrypoint-interact) 中,仔细阅读四个要点:“Dockerfile_should_specify at至少“CMD”或“ENTRYPOINT”命令之一”,“当使用替代参数运行容器时,“CMD”将被覆盖”。我相信您处于矩阵中的“CMD [""]”、“无入口”单元格中。 (2认同)