📜  RUN vs CMD vs ENTRYPOINT Docker 命令之间的区别

📅  最后修改于: 2022-05-13 01:57:04.958000             🧑  作者: Mango

RUN vs CMD vs ENTRYPOINT Docker 命令之间的区别

当您编写dockerfile以创建 Docker 映像时,可以互换使用CMDRUNENTRYPOINT等命令。但是,如果您刚刚开始使用 Docker,或者您没有足够的使用这些命令的实践经验,那么这些命令可能会给您带来很多困惑。在本文中,我们将通过实际示例深入讨论所有三个命令。

但在深入解释之前,我们需要先了解不同的执行形式。我们可以使用两种不同的形式在 Docker 中执行命令

外壳形式:

 如果我们选择以 shell 形式执行命令,就会发生正常的 shell 处理。在幕后,bash 调用/bin/sh -c 。 shell命令的一般形式如下图所示:

 

要获得更清晰的图像,请查看以下命令。

RUN apt-get -y install firefox
CMD echo "GeeksforGeeks"
ENTRYPOINT echo "GeeksforGeeks"

上述两个命令都输出“GeeksforGeeks”。执行命令的 shell 形式一般用于RUN命令。

可执行形式:

命令的可执行形式一般用于CMDENTRYPOINT命令。可执行命令的一般形式如下图所示:

 ["executable", "parameter no. 1", "parameter no. 2", ...]

使用可执行形式的命令直接执行命令,不进行 shell 处理。查看以下命令:

ENTRYPOINT ["/bin/echo", "geeksforgeeks"]
CMD ["/bin/echo", "geeksforgeeks"]

现在让我们尝试深入了解RUNCMDENTRYPOINT命令。

1.运行命令:

当您在dockerfile中使用RUN命令时,它总是会在之前的图像层之上创建一个新的中间图像层。这就是为什么总是建议将所有RUN命令链接在一起。

跑步 可执行形式的命令是:

RUN ["apt-get", "install", "firefox"]

shell 形式的 RUN 命令是:

RUN apt-get -y install firefox

2.cmd命令

CMD命令用于设置运行 Docker 容器后执行的默认命令。如果您使用 Docker 运行命令提供命令,则CMD参数会从dockerfile 中被忽略。在多个CMD命令的情况下,只有最后一个被执行。

CMD ["python3", "app.py"]

如果您在dockerfile 中使用 ENTRYPOINT 则可以使用CMD命令的以下形式添加一些附加参数。

CMD ["parameter 1", "parameter 2"]

请注意,如果您在 Docker 运行命令中提供参数,则CMD命令将被忽略。

sudo docker run -it ubuntu bash

如果您使用上述命令,同时在dockerfile中使用了CMD命令,它会被忽略并简单地打开 bash。

例如,如果dockerfile包含:

dockerfile

输入文件

如果我们将附加参数与 docker run 命令一起使用,例如“bash”,它将简单地打开 bash 而不会回显任何内容。

输出

输出

3.入口点命令

ENTRYPOINT命令与CMD不同,不会忽略您在 Docker 运行命令中指定的其他参数。

考虑下面的例子:

ENTRYPOINT ["echo", "Geeksforgeeks "]
CMD ["Docker Tutorials"]

例如,如果dockerfile

dockerfile

输入

在没有任何附加参数的情况下运行 Docker 容器的上述命令的输出将是 -

Geeksforgeeks Docker Tutorials
输出

输出

如果您指定其他参数,则CMD参数将被忽略。

总而言之,在本文中,我们讨论了用于执行dockerfile指令的 shell 和可执行形式。然后,我们通过一个示例讨论了RUNCMDENTRYPOINT命令之间的区别。