Dockerfile 中 ENTRYPOINT 和 CMD 的区别

在 Docker 的世界里,ENTRYPOINT 和 CMD 是两个非常关键的概念,它们都用于指定容器启动时要执行的命令。然而,它们之间有着细微的区别。在这篇文章中,我们将深入探讨 Dockerfile 中 ENTRYPOINT 和 CMD 的区别,并通过示例来更好地理解它们。

CMD

CMD 指令的主要用途是为正在执行的容器提供默认值。换句话说,它指定了容器启动时默认要运行的命令。在 Dockerfile 中,CMD 可以有三种形式:

  1. exec 形式:这是推荐的形式,它使用 JSON 数组格式来指定命令和参数。

    CMD ["executable", "param1", "param2"]
    
  2. 作为默认参数传递给 ENTRYPOINT:在这种情况下,CMD 提供的参数将被传递给 ENTRYPOINT。

    CMD ["param1", "param2"]
    
  3. 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 可以有两种形式:

  1. exec 形式:与 CMD 的 exec 形式相同,使用 JSON 数组格式来指定命令和参数。

    ENTRYPOINT ["executable", "param1", "param2"]
    
  2. 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 非常重要。


正文到此结束
评论插件初始化中...
Loading...