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. Java(43)JDK新特性之方法引用

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228461.html 博客主页:https://www.cnblogs.com/testero ...

  2. 阿里Nacos部署

    Nacos的部署 一.单机部署 **4.修改 Nacos 存储为 Mysql** 二.集群部署 1.机器部署列表 2.修改 `nacos/conf/application.properties`中的端 ...

  3. GT考试

    比较神仙的$dp+KMP+Matrix$综合题目,比较值得一写 $0x00$:首先我打了一个爆搜 不过对正解并无任何启发...(逗比发言请忽略) $0x01$:基础$dp$ 状态还是比较好设的, 考虑 ...

  4. cadence 技巧

    pcb中如何选中完整的一条网络? 1 edit  properties  右边 find nets 2 cadence 选中不同的网络高亮 display--->assign color在opt ...

  5. Linux零基础之shell基础编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  6. HITS算法简介

    1.算法名称 超文本敏感标题搜索 (Hyperlink-Induced Topic Search) 2.算法背景 HITS 算法是由康奈尔大学的Jon Kleinberg 博士于1997 年首先提出的 ...

  7. linked-list-cycle-ii leetcode C++

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

  8. freeswitch的docker构建过程

    概述 Docker是一个开源的应用容器引擎,可以让开发者打包应用以及依赖包到一个轻量级.可移植的容器中,并在任何安装有Docker的机器上运行. Docker 使你能够将应用程序与基础架构分开,从而可 ...

  9. docker的集群管理工具

    docker 集群管理三剑客: docker compose: Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的 ...

  10. Spring Security OAuth2 单点登录

    1. OAuth 2.0 OAuth(Open Authorization)为用户资源的授权提供了一个安全的.开放而又简易的标准.最简单的理解,我们可以看一下微信OAuth2.0授权登录流程: 通过O ...