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

mzaanser  于 2023-06-05  发布在  Docker
关注(0)|答案(3)|浏览(256)

我已经阅读了关于CMD和ENTRYPOINT的文档
https://docs.docker.com/engine/reference/builder/#entrypoint
这里,他们在表中提到“不允许使用CMD和ENTRPOINT”,但我创建了一个没有CMD和ENTRPOINT的Dockerfile,并且成功构建了映像。从这里下载alpine tar Alpine Tar
Dockerfile

from scratch 
ADD alpine-minirootfs-3.11.2-x86_64.tar.gz /
COPY . /

构建图像:

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
/ #

成功了!!那么为什么在文档中提到CMD或ENTRYPOINT是必需的呢?

ztyzrc3y

ztyzrc3y1#

docker run命令行末尾指定一个命令可以提供(或覆盖)CMD;类似地,docker run --entrypoint选项提供(或覆盖)ENTRYPOINT。在您的示例中,您给出了一个命令/bin/sh,因此容器需要执行一些操作;如果您关闭它,您将得到一个错误。
作为一种风格,你的Dockerfiles应该几乎总是声明一个CMD,除非你正在扩展一个已经自动运行应用程序的基础镜像(nginxtomcat)。这将允许您docker run图像并启动嵌入其中的应用程序,而不必记住更具体的命令行调用。

toiithl6

toiithl62#

文件中的以下行不正确。

Dockerfile should specify at least one of CMD or ENTRYPOINT commands.

可能应该写上-
CMD or ENTRYPOINT is necessary for running a container.

pbgvytdp

pbgvytdp3#

CMDENTRYPOINT都是Dockerfile指令,用于指定运行Docker容器时将执行的命令。ENTRYPOINT设置每次容器启动时要执行的主命令,并且不会被命令行参数覆盖。另一方面,CMDENTRYPOINT提供了默认参数,或者提供了一个默认命令,可以在运行时通过命令行参数轻松覆盖。如果一起使用,CMD参数将成为ENTRYPOINT命令的附加参数。

CMD/ENTRYPOINT gets inherited from base image

if ENTRYPOINT exists
  CMD is arguments to ENTRYPOINT
else if CMD exists
  CMD should have an executable and optionally arguments

CMD can be overridden at runtime as `docker run` arguments at the end
To override ENTRYPOINT, need to use `--entrypoint`

即使在基本映像和最终的Dockerfile中都没有CMDENTRYPOINT,您仍然可以通过在末尾指定命令来运行带有docker run的容器。
否则是错误!

% docker inspect scratch:test | jq '.[].Config.Cmd, .[].Config.Entrypoint'
null
null

% docker run -it --rm --name scratch-test scratch:test /bin/sh
/ # exit

% docker run -it --rm --name scratch-test scratch:test
docker: Error response from daemon: No command specified.
See 'docker run --help'.

相关问题