RUN vs CMD vs ENTRYPOINT Docker 命令之间的区别
当您编写dockerfile以创建 Docker 映像时,可以互换使用CMD 、 RUN和ENTRYPOINT等命令。但是,如果您刚刚开始使用 Docker,或者您没有足够的使用这些命令的实践经验,那么这些命令可能会给您带来很多困惑。在本文中,我们将通过实际示例深入讨论所有三个命令。
但在深入解释之前,我们需要先了解不同的执行形式。我们可以使用两种不同的形式在 Docker 中执行命令。
外壳形式:
如果我们选择以 shell 形式执行命令,就会发生正常的 shell 处理。在幕后,bash 调用/bin/sh -c 。 shell命令的一般形式如下图所示:
要获得更清晰的图像,请查看以下命令。
RUN apt-get -y install firefox
CMD echo "GeeksforGeeks"
ENTRYPOINT echo "GeeksforGeeks"
上述两个命令都输出“GeeksforGeeks”。执行命令的 shell 形式一般用于RUN命令。
可执行形式:
命令的可执行形式一般用于CMD和ENTRYPOINT命令。可执行命令的一般形式如下图所示:
["executable", "parameter no. 1", "parameter no. 2", ...]
使用可执行形式的命令直接执行命令,不进行 shell 处理。查看以下命令:
ENTRYPOINT ["/bin/echo", "geeksforgeeks"]
CMD ["/bin/echo", "geeksforgeeks"]
现在让我们尝试深入了解RUN 、 CMD和ENTRYPOINT命令。
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包含:
如果我们将附加参数与 docker run 命令一起使用,例如“bash”,它将简单地打开 bash 而不会回显任何内容。
3.入口点命令
ENTRYPOINT命令与CMD不同,不会忽略您在 Docker 运行命令中指定的其他参数。
考虑下面的例子:
ENTRYPOINT ["echo", "Geeksforgeeks "]
CMD ["Docker Tutorials"]
例如,如果dockerfile是
在没有任何附加参数的情况下运行 Docker 容器的上述命令的输出将是 -
Geeksforgeeks Docker Tutorials
如果您指定其他参数,则CMD参数将被忽略。
总而言之,在本文中,我们讨论了用于执行dockerfile指令的 shell 和可执行形式。然后,我们通过一个示例讨论了RUN 、 CMD和ENTRYPOINT命令之间的区别。