Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别?

我们可以通过在 Dockerfile 中指定指令来构建 Docker 镜像。Dockerfile 允许我们指定分步说明,这些说明定义了创建容器环境的规则。Docker 容器是为在其中运行的特定任务和进程而创建的。在 Dockerfile 中使用了三个重要的指令,让我们定义哪些进程需要在容器内运行,以及以什么顺序和顺序运行。

这 3 条指令是 -

  • RUN

  • CMD

  • ENTRYPOIN

RUN 指令非常简单。我们可以定义简单的子命令以及要在容器内执行的 RUN 指令。例如,如果我们想安装一个 pip 包,我们可以简单地使用 Dockerfile 中的“RUN pip install package_name”指令。

然而,另外两个指令 - CMD 和 ENTRYPOINT 可能会很混乱,尤其是对于初学者。在本文中,我们将讨论用例和这两个命令之间的区别以及一些有用的示例。但是在我们进入它们之前,我们需要了解在 Dockerfile 中编写指令的 shell 和 exec 形式

Shell形式

当我们使用 shell 形式指定指令时,正常的 shell 处理发生在后台。守护进程在执行 shell 形式的命令时在后台调用命令 shell。以 shell 形式指定命令的格式是 -

$ <instruction> <command>

可执行表格

当我们以可执行形式编写命令并执行这些命令时,正常的shell处理不会在后台发生。相反,可执行文件被直接调用。以可执行形式指定命令的格式是 -

$ <instruction> ["executable", "parameter", "parameter", . . . .]

命令的 shell 形式一般用于 RUN 指令,可执行形式一般用于 CMD 和 ENTRYPOINT 指令。

CMD指令

您可以使用 CMD 指令设置带参数的默认命令。如果你运行一个 Docker 容器而不指定任何额外的 CLI 命令,CMD 指令将被执行。您可以包含一个可执行文件作为默认命令。但是,如果您选择省略它,则必须与 CMD 指令一起指定 ENTRYPOINT 指令

如果您在 Docker 运行命令中指定了一个参数,则使用 CMD 指令指定的默认参数将被忽略。此外,如果您在单个 dockerfile 中指定了多个 CMD 指令,则只会执行最后一个指定的指令。

CMD指令有三种形式——

  • CMD ["only_executable","parameter_1","parameter_1"](可执行形式)

  • CMD ["parameter_1","parameter_2"](用于为ENTRYPOINT指令提供默认参数)

  • CMD 命令 param1 param2 (是shell形式)

例子 -

$ CMD echo "Command in Shell Form"
$ CMD ["/bin/bash", "-c", "echo Command in Exec Form"]

ENTRYPOINT指令

ENTRYPOINT 指令看起来几乎与 CMD 指令相似。但是,它们之间的主要突出区别在于它不会忽略您在 Docker 运行命令中指定的任何参数(CLI 参数)。

当我们在可执行形式中指定了 ENTRYPOINT 指令时,它允许我们使用 Dockerfile 中的 CMD 指令设置或定义一些额外的参数/参数。如果我们以 shell 形式使用它,它将忽略任何 CMD 参数甚至任何 CLI 参数。

ENTRYPOINT 指令的形式是 -

  • ENTRYPOINT ["only_executable", "parameter_1", "parameter_2"](可执行形式)

  • ENTRYPOINT 命令参数_1 参数_2(外壳形式)

例子 -

$ ENTRYPOINT echo "Welcome to nhooo"
$ ENTRYPOINT ["/bin/bash", "-c", "echo Welcome to nhooo"]

最后的想法!

综上所述,如果你想指定默认命令和启动 Docker 容器时需要运行的参数,你可以使用 CMD 指令。如果您与 Docker 运行命令一起指定参数,则使用 CMD 指令指定的参数将被忽略。这意味着使用 Docker run 命令的 CLI 参数将覆盖使用 CMD 指令指定的参数。

另一方面,ENTRYPOINT 指令有两种情况。如果您在 shell 形式中使用 ENTRYPOINT 指令并使用 CLI 参数或什至通过 CMD 命令提供附加参数,则 ENTRYPOINT 指令将覆盖所有这些。但是,如果以可执行形式使用 ENTRYPOINT 指令,则可以使用 CMD 指令设置附加参数。

根据您的要求和用例,您可以采用这些命令中的任何一个。