Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别?
我们可以通过在Dockerfile中指定指令来构建Docker镜像。Dockerfile允许我们指定分步说明,这些说明定义了创建容器环境的规则。Docker容器是为在其中运行的特定任务和进程而创建的。在Dockerfile中使用了三个重要的指令,让我们定义哪些进程需要在容器内运行,以及以什么顺序和顺序运行。
这3条指令是-
RUN
CMD
ENTRYPOIN
RUN指令非常简单。我们可以定义简单的子命令以及要在容器内执行的RUN指令。例如,如果我们想安装一个pip包,我们可以简单地使用Dockerfile中的“RUNpipinstallpackage_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命令param1param2(是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指令指定的参数将被忽略。这意味着使用Dockerrun命令的CLI参数将覆盖使用CMD指令指定的参数。
另一方面,ENTRYPOINT指令有两种情况。如果您在shell形式中使用ENTRYPOINT指令并使用CLI参数或什至通过CMD命令提供附加参数,则ENTRYPOINT指令将覆盖所有这些。但是,如果以可执行形式使用ENTRYPOINT指令,则可以使用CMD指令设置附加参数。
根据您的要求和用例,您可以采用这些命令中的任何一个。
评论列表