Docker 的CMD与ENTRYPOINT区别

我们在构建一个docker镜像的时候,Dockerfile里面有两个命令会引起我们的注意,它们就是 CMD 和 ENTRYPOINT,看起来很相似,实际上并非如此。

一、CMD

 顾名思义就是允许用户指定容器默认执行的命令。此命令会在docker run 没有指定其他命令的时候运行,换句话说,这个命令会被 docker run 指定的命令覆盖,即具有覆盖性,那么我们可以得出以下两个结论:

  1. 如果 docker run 指定了其他命令的话,那么CMD的命令将会被覆盖。
  2. 如果 Dockerfile 有多个CMD 指令,那么最终因为覆盖性,只会执行最后一条。

 CMD的三种格式

  1. Exec 格式:CMD["executable", "param1", "param2"]。
  2. 为 ENTRYPOINT 提供额外的参数:CMD["param1", "param2"],此时 ENTRYPOINT 必须使用 Exec 格式。
  3. Shell 格式:CMD command param1 param2,比如: CMD echo "hehehe",docker run 不带命令运行会直接输出: hehehe。

二、ENTRYPOINT

  翻译过来是进入点,大概是可以由这个点进入容器内部的命令执行。

准确的定义是:可以让容器以应用程序或者服务的形式进行。

 ENTRYPOINT的两种格式

  1. Exec 格式:ENTRYPOINT["executable", "param1", "param2"]
  2. Shell 格式:ENTRYPOINT command param1 param2,比如: CMD echo "hehehe",直接输出: hehehe。

其中如果 CMD 与 ENTRYPOINT搭配使用的话,CMD 可以为 ENTRYPOINT 提供额外的参数。

ENTRYPOINT ["/bin/echo", "nihao"]
CMD ["laowang"]

当容器通过 docker run -it <镜像名称> 启动的时候,输出:nihao laowang

当容器通过 docker run -it <镜像名称> lisi 启动的时候,输出:nihao lisi

PS.ENTRYPOINT  的 Shell 格式会忽略任何 CMD 或者 docker run 提供的参数。

原文地址:https://www.cnblogs.com/cxbhakim/p/8530469.html