Docker CMD 与 ENTRYPOINT:解释差异
我们IT人士都喜欢摆弄新技术,Docker也不例外。事实上,在2019年的Stack Overflow开发者调查中,Docker被评为最想要的平台第一名、最受喜爱的平台第二名和使用最广泛的平台第三名。在2020年的调查中,Docker也被评为最想要的平台第一名、最受喜爱的平台第二名和最流行平台第三名。
如果你碰巧读到这篇文章,你很可能被
水果狗狗CMD
和Dockerfile 中定义的指令之间的区别ENTRYPOINT
,用于描述如何运行 Docker 容器。
但是 Docker 容器是什么?
容器是轻量级、独立、可执行的软件包,旨在运行特定任务,无论是短期还是长期运行。因此,容器的生命周期取决于其内部正在进行的进程。
一旦进程停止,容器也会停止。
好的,但是我们的 Dockerfile 在这里扮演什么角色?
容器依赖于镜像,并使用镜像构建运行时环境来运行应用程序。Dockerfile 是一个脚本,其作用是定义最终镜像的创建流程,以及如何运行绑定到该镜像的容器。
创建 Docker 镜像的过程通常始于一个FROM
命令,定义一个基础镜像,用于构建镜像。接下来我们通常会执行一系列RUN
指令,用于运行修改底层文件系统的命令。
每条
RUN
指令都会创建一个包含对文件系统的修改的新图像层。
好的。那么 CMD 和 ENTRYPOINT 之间如何呢?
CMD
和ENTRYPOINT
是两种不同类型的指令,用于定义 Docker 容器的运行方式。
让我们深入了解一下它们的细节:
命令
指令CMD
定义了从镜像运行 Docker 容器所使用的默认命令。
给出如下简单图像:
FROM alpine
CMD ["echo", "Hello, World!"]
使用以下命令运行它:
docker container run my-container
将产生以下结果:
Hello, World!
Dockerfile 可以包含多
CMD
条指令,但除了最后一条指令之外,其他每条指令都将被忽略。
CMD
可以通过传递给的参数覆盖指令,docker container run
例如:
docker container run my-container echo "Hello again!"
将产生:
Hello again!
入口点
ENTRYPOINT
指令定义用于启动容器的默认命令,就像它们的 CMD 兄弟一样。
FROM alpine
ENTRYPOINT ["echo", "Hello, World!"]
将产生:
Hello, World!
很酷,那么...现在有什么区别?
嗯,主要的区别是,如果在 Dockerfile 中定义了CMD
和指令,则该指令将连接到以下指令:ENTRYPOINT
CMD
ENTRYPOINT
FROM alpine
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]
威尔带领我们看到:
Hello, World!
此外,虽然CMD
根据设计,可以通过向docker container run
命令传递参数来轻松覆盖指令,但ENTRYPOINT
通过强制用户使用标志,故意使其更难以手动覆盖--entrypoint
。
这让我们得出一个模式
这种设计使我们形成了一致的模式。我们喜欢模式,模式有益于我们的心理健康:
我们可以使用它ENTRYPOINT
来定义始终执行的基本命令,并CMD
为该命令定义默认参数,可以通过将自定义参数传递给来轻松覆盖docker container run
。