CMD与ENTRYPOINT都可以代表容器的启动命令,单丛语义上来理解,CMD是一个命令或者口令,而ENTRYPOINT则是一个入口(相当于容器启动时的入口),那么其实就可以理解为每当我们开启一个容器都需要带着口令去进入容器的入口。虽然两者可以单独使用,但根据业务需求往往是将两者搭配起来使用更加方便与规范。

先来看一张表

这是在Dockerfile中使用CMD与ENTRYPOINT的几种组合情况,两者可以定义在运行容器时执行了什么命令。

注意事项:

  • CMD与ENTRYPOINT在Dockerfile里应该至少指定一个
  • 当容器作为可执行文件使用时,应该定义ENTRYPOINT
  • CMD应该用作定义ENTRYPOINT命令或在容器中执行特别命令的默认参数的方法
  • 当运行带有替代参数的容器时,CMD将被覆盖

两者单独使用

从表中可以看出两者均可单独当做启动命令使用,但是灵活性并不是很高,比如传参等。

1. 对于CMD来讲,有三种写法:

  • CMD ["executable","p1","p2"] (exec方式, 首选方式)
  • CMD ["p1","p2"] (为ENTRYPOINT提供默认参数,需与ENTRYPOINT结合使用)
  • CMD command p1 p2 (shell形式)

当在Dockerfile中单独使用CMD作为容器启动命令(CMD ["executable","p1","p2"] )时,只允许使用一个CMD,若有多个则以最后一个为主。

此外,CMD作为启动命令,当外部(命令行)传入启动命令时,外部命令会覆盖CMD中的启动命令。

2. 对于ENTRYPOINT来讲,有两种写法:

  • ENTRYPOINT ["executable", "p1", "p2"] (exec方式, 首选方式)
  • ENTRYPOINT command param1 param2 (shell 形式)

当在Dockerfile中单独使用ENTRYPOINT作为容器启动命令时,外部传入的启动命令不会覆盖ENTRYPOINT中的命令。

另外需要注意的是两者通过exec的方式取不出来环境变量,但是通过shell方式可以取出环境变量。

如果既想要使用exec方式又要取环境变量,则可以通过/bin/sh -c的方式(RUN指令也类似)

例如:ENTRYPOINT ["/bin/sh", "-c", "echo ${p1}"] (["/bin/sh", "-c", "指令均写在这里"] = shell形式)

两者结合使用

官方推荐:ENTRYPOINT(提供可执行命令+参数(可选)) + CMD(只提供参数) = 容器的完整命令

如果使用CMD为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令均应使用JSON数组格式指定。

在CMD中自定义的参数必须要传完整,容器才可成功启动。

Dockerfile之CMD与Entrypoint使用要点的更多相关文章

  1. Dockerfile中CMD和ENTRYPOINT的区别

    当启动一个容器时,CMD和ENTRYPOINT都可以用来执行启动命令.但它们的具体用法还是有一些区别: 1. Dockerfile必须至少指定CMD或者ENTRYPOINT其中的一个. 2. ENTR ...

  2. docker 15 dockerfile案例-CMD、ENTRYPOINT案例

    CMD.ENTRYPOINT都是指定一个容器启动时要运行的命令.但是CMD会覆盖前面的参数,而ENTRYP会追加组合原来的参数 未完待续...

  3. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  4. Dockerfile 中的 CMD 与 ENTRYPOINT

    CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令.单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现绝大多数的用例.但是既然 doker 同时提供了它们,为了在 ...

  5. Dockerfile RUN, CMD & ENTRYPOINT

    Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. RUN是在 ...

  6. FW: Dockerfile RUN, CMD & ENTRYPOINT

    Dockerfile RUN, CMD & ENTRYPOINT     在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. R ...

  7. Dockerfile 中的 CMD 与 ENTRYPOINT(转)

    add by zhj:  CMD和ENTRYPOINT的差异很小,可以认为完全可以相互代替.两者都支持shell模式和exec模式, shell模式:跟你在shell下执行命令的格式一样,简单方便,但 ...

  8. Docker | dockerfile构建centos镜像,以及CMD和ENTRYPOINT的区别

    构建自己的centos镜像 docker pull centos下载下来的镜像都是基础版本,缺少很多常用的命令功能,比如:ll.vim等等, 下面介绍制作一个功能较全的自己的centos镜像. 步骤 ...

  9. 论docker中 CMD 与 ENTRYPOINT 的区别

    Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此: CMD指令: The main purpose of a ...

随机推荐

  1. XiaoXin 13Pro-Hackintosh 小新13pro崇尚极简的黑苹果双系统

    Lenovo XiaoXin-13-Pro-Hackintosh 关键词:Hackintosh XiaoXin EFI Tutorial Lenovo 以下提及的EFI及其他部分文件见github仓库 ...

  2. VUE中v-for更新检测

    口诀: 数组变更方法,就会导致 v-for 更新,页面更新 数组非变更方法:返回新数组,就不会导致 v-for 更新,更新值检测不到可采用覆盖或者 this.$set() 数组变更方法如下: 1. a ...

  3. 数据结构与算法-基础(十一)AVL 树

    AVL 树 是最早时期发明的自平衡二叉搜索树之一.是依据它的两位发明者的名称命名. AVL 树有一个重要的属性,即平衡因子(Balance Factor),平衡因子 == 某个节点的左右子树高度差. ...

  4. 【Spring】重新认识 IoC

    前言 IoC (Inversion of control) 并不是Spring特有的概念. IoC 维基百科的解释: In software engineering, inversion of con ...

  5. Java集合 - 集合知识点总结概述

    集合概述 概念:对象的容器,定义了对多个对象进项操作的的常用方法.可实现数组的功能. 和数组的区别: 数组长度固定,集合长度不固定. 数组可以存储基本类型和引用类型,集合只能存储引用类型. 位置: j ...

  6. 单片机零基础学习之从“点灯”入门STM32

    本篇文章通过一个简单的例子来熟悉模块化编程以及利用库函数的方法进行开发使用STM32外设的基本流程. 首先,我们打开本讲的例程,在工程目录我们可以看到驱动分组下有 led.delay 两个.c源文件, ...

  7. 『学了就忘』Linux基础 — 15、了解Linux系统的目录结构

    目录 1.一级目录说明 (1)一级目录列表 (2)/bin/和/sbin/目录说明 (3)/boot/目录说明 (4)/lib/和/lib64/目录说明 (5)/lost+found/目录说明 (6) ...

  8. 转:VIVADO使用技巧:设置DCI与内部参考电压

    本文转自:Vivado使用技巧(12):设置DCI与内部参考电压 - 灰信网(软件开发博客聚合) (freesion.com) DCI与内部参考电压 Xilinx FPGA提供了DCI(Digital ...

  9. 源码安装的应用 rpm 命令无法查询

    源码安装:一大堆源码文件,需要编译后才能使用(编译需要安装编译器 :yum install gcc) rpm 安装:redhat 官网或其它开源网站编译好发布,已经编译好的安装包,使用 rpm -iv ...

  10. Spring @Component生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致

    正确注入方式: @Autowired private TFeeMapper TFeeMapper; 错误注入方式 @Autowired private TFeeMapper tFeeMapper; 这 ...