Dockerfile 中 ENTRYPOINT 和 CMD 的区别
- 发布时间:2024-06-11 21:38:36
- 本文热度:浏览 342 赞 0 评论 0
- 文章标签: Docker Dockerfile ENTRYPOINT
- 全文共1字,阅读约需1分钟
在 Docker 的世界里,ENTRYPOINT 和 CMD 是两个非常关键的概念,它们都用于指定容器启动时要执行的命令。然而,它们之间有着细微的区别。在这篇文章中,我们将深入探讨 Dockerfile 中 ENTRYPOINT 和 CMD 的区别,并通过示例来更好地理解它们。
CMD
CMD 指令的主要用途是为正在执行的容器提供默认值。换句话说,它指定了容器启动时默认要运行的命令。在 Dockerfile 中,CMD 可以有三种形式:
-
exec 形式:这是推荐的形式,它使用 JSON 数组格式来指定命令和参数。
CMD ["executable", "param1", "param2"]
-
作为默认参数传递给 ENTRYPOINT:在这种情况下,CMD 提供的参数将被传递给 ENTRYPOINT。
CMD ["param1", "param2"]
-
shell 形式:它使用 /bin/sh -c 来执行命令。
CMD command param1 param2
值得注意的是,当运行 docker run
命令时,如果提供了参数,那么 CMD 中的命令将被覆盖。例如,如果你有一个镜像的 CMD 是 /bin/echo "Hello World"
,当你运行 docker run myimage /bin/bash
时,CMD 中的命令将被 /bin/bash
覆盖,因此不会输出 "Hello World"。
ENTRYPOINT
ENTRYPOINT 指令也用于指定容器启动时要执行的命令。与 CMD 不同的是,ENTRYPOINT 不会被 docker run
命令提供的参数覆盖。此外,ENTRYPOINT 可以有两种形式:
-
exec 形式:与 CMD 的 exec 形式相同,使用 JSON 数组格式来指定命令和参数。
ENTRYPOINT ["executable", "param1", "param2"]
-
shell 形式:使用 /bin/sh -c 来执行命令。
ENTRYPOINT command param1 param2
ENTRYPOINT 的一个关键特性是,当你使用 docker run
命令添加额外的参数时,这些参数会被追加到 ENTRYPOINT 指定的命令后面。例如,如果你的 Dockerfile 中有 ENTRYPOINT ["echo", "Hello"],CMD ["World"],那么当你运行 docker run myimage
时,输出将是 "Hello World"。而如果你运行 docker run myimage Friend
,输出将是 "Hello Friend"。
示例
让我们通过一个具体的 Dockerfile 示例来更深入地理解 ENTRYPOINT 和 CMD 的区别:
FROM ubuntu
ENTRYPOINT ["echo", "time"]
CMD ["start"]
在这个例子中,当容器启动时,默认会执行 echo time start
。但是,如果你在启动容器时添加额外的参数,比如 docker run myimage end
,那么执行的命令将是 echo time end
。
结论
ENTRYPOINT 和 CMD 都是 Dockerfile 中的指令,用于指定容器启动时要执行的命令。CMD 提供了默认的命令和参数,而 ENTRYPOINT 则定义了容器启动时要执行的命令,不会被 docker run
命令提供的参数覆盖。理解它们之间的区别对于编写高效的 Dockerfile 非常重要。