【转】Dockerfile: ENTRYPOINT和CMD的区别

https://zhuanlan.zhihu.com/p/30555962

  • ENTRYPOINTCMD都是让用户指定一个可执行程序

    • 这个可执行程序在container启动后自动启动.
  • 如果你想让自己制作的镜像自动运行程序(不需要在docker run后面添加命令行指定运行的命令) , 则必须在Dockerfile里面, 使用ENTRYPOINT或者CMD命令

    • 否则执行运行一个没有调用ENTRYPOINT或者CMDdocker镜像, 一定返回错误

规则

覆盖

  • 在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令.

  • 我们也可以在命令行启动docker镜像时, 执行其他命令行参数, 覆盖默认的CMD

    • 如下,覆盖命令为hostname
      docker run demo hostname
      
  • CMD类似, 默认的ENTRYPOINTdocker run时也可以被覆盖.

    • 在运行时, 用--entrypoint覆盖默认的ENTRYPOINT
      docker run --entrypoint
      

区别

  • 可见,用户在执行docker run的时候,CMD的默认程序比ENTRYPOINT更容易被覆盖

写法(Shell vs. Exec)

  • ENTRYPOINTCMD指令都支持2种不同的写法:
    • shell表示法和exec表示法

下面的例子使用了shell表示法:

CMD executable  param1 param2
  • 当使用shell表示法时, 命令行程序作为sh程序子程序运行(docker/bin/sh -c的语法调用命令行程序

  • 如果我们用docker ps命令查看运行的docker, 就可以看出实际运行的是/bin/sh -c命令

  • 虽然shell表示法看起来可以顺利工作, 但是它其实上有一些小问题存在.

exec表示法:

CMD ["executable","param1","param2"] 
  • 它没有shell的表示法的缺点

ENTRYPOINT 和 CMD 组合使用

  • 在某种情况下, 组合ENTRYPOINTCMD能发挥更大的作用

  • ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数.

    • ENTRYPOINTCMD同时存在时, docker会把CMD的命令拼接到ENTRYPOINT命令之后

例子

FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"] 
  • 这里docker最终运行的命令是:ping -c 3 localhost

猜你喜欢

转载自blog.csdn.net/weixin_34204722/article/details/87236759