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

CMD指令:

The main purpose of a CMD is to provide defaults for an executing container.

CMD在容器运行的时候提供一些命令及参数,用法如下:

  • CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  • CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  • CMD command param1 param2 (shell form)

第一种用法:运行一个可执行的文件并提供参数。

第二种用法:为ENTRYPOINT指定参数。

第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。

如你指定:

CMD [“/bin/echo”, “this is a echo test ”]

build后运行(假设镜像名为ec):

docker run ec

就会输出: this is a echo test

是不是感觉很像开机启动项,你可以暂时这样理解。

注意点:

docker run命令如果指定了参数会把CMD里的参数覆盖: (这里说明一下,如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it只是docker 的参数,而不是容器的参数,以下所说参数均如此。)

同样是上面的ec镜像启动:

docker run ec /bin/bash

不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。

ENTRYPOINT  

字面意思是进入点,而它的功能也恰如其意。

An ENTRYPOINT allows you to configure a container that will run as an executable.它可以让你的容器功能表现得像一个可执行程序一样。

容器功能表现得像一个可执行程序一样,这是什么意思呢?

直接给个例子好说话:

例子一:

使用下面的ENTRYPOINT构造镜像:

ENTRYPOINT ["/bin/echo"]

那么docker build出来的镜像以后的容器功能就像一个/bin/echo程序:

比如我build出来的镜像名称叫imageecho,那么我可以这样用它:

docker  run  -it  imageecho  “this is a test”

这里就会输出”this is a test”这串字符,而这个imageecho镜像对应的容器表现出来的功能就像一个echo程序一样。 你添加的参数“this is a test”会添加到ENTRYPOINT后面,就成了这样 /bin/echo “this is a test” 。现在你应该明白进入点的意思了吧。

例子二:

ENTRYPOINT ["/bin/cat"]

构造出来的镜像你可以这样运行(假设名为st):

docker run -it st /etc/fstab

这样相当: /bin/cat  /etc/fstab 这个命令的作用。运行之后就输出/etc/fstab里的内容。

ENTRYPOINT有两种写法:    

写法一:ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)

写法二:ENTRYPOINT command param1 param2 (shell form)

你也可以在docker run 命令时使用–entrypoint指定(但是只能用写法一)。

下面是我把ENTRYPOINT设为[“/bin/sh -c”]时候运行的情况:

  • linux-oj9e:/home/lfly/project/docker # docker run -it  t2  /bin/bash
  • root@4c8549e7ce3e:/# ps
  • PID TTY          TIME CMD
  • 1 ?        00:00:00  sh
  • 9 ?        00:00:00  bash
  • 19 ?        00:00:00  ps

可以看到PID为1的进程运行的是sh,而bash只是sh的一个子进程,/bin/bash只是作为 /bin/sh -c后面的参数。

CMD可以为ENTRYPOINT提供参数,ENTRYPOINT本身也可以包含参数,但是你可以把那些可能需要变动的参数写到CMD里而把那些不需要变动的参数写到ENTRYPOINT里面例如:

FROM  ubuntu:14.10

ENTRYPOINT  ["top", "-b"]

CMD  ["-c"]

把可能需要变动的参数写到CMD里面。然后你可以在docker run里指定参数,这样CMD里的参数(这里是-c)就会被覆盖掉而ENTRYPOINT里的不被覆盖。

注意点1:

ENTRYPOINT有两种写法,第二种(shell form)会屏蔽掉docker run时后面加的命令和CMD里的参数。

注意点2:

网上有资料说ENTRYPOINT的默认值是[”/bin/sh -c”],但是笔者在试验的时候得到的结果并不是这样的。

 笔者使用ENTRYPOINT [“/bin/sh -c”] 指令构造一个以/bin/sh -c为进入点的镜像,命名为sh,然后我可以这样运行:

 docker  run  -it  sh  “while(ture )  do echo loop; done”

 运行结果就是无限输出loop。但如果直接运行一个ubuntu:14.10镜像,情况不是这样的:

docker  run  -it  ubuntu:14.10  “while(ture )  do echo loop; done”

得到这样的错误:

linux-oj9e:/home/lfly # docker run -it ubuntu:14.10 “while(true) do echo this; done” 2014/11/16 18:07:53 Error response from daemon: Cannot start container 4bfe9c6faeec3ed465788a201a2f386cb1af35aba197dbc78b87c0d5dda1f88e: exec: “while(true) do echo this; done”: executable file not found in $PATH

可以猜想默认情况下ENTRYPOINT并不是[“/bin/sh -c”]。

而且直接运行ubuntu:14.10列出程序也可以看到PID为1的程序并不是sh。所以更否定了网友的说法,ENTRYPOINT并不默认为[“/bin/sh -c”] 。

转载于:https://www.cnblogs.com/zjd2626/p/7323633.html

论docker中 CMD 与 ENTRYPOINT 的区别相关推荐

  1. Dockerfile中CMD和ENTRYPOINT的区别

    2019独角兽企业重金招聘Python工程师标准>>> 当启动一个容器时,CMD和ENTRYPOINT都可以用来执行启动命令.但它们的具体用法还是有一些区别: 1. Dockerfi ...

  2. 一起学Docker:CMD与ENTRYPOINT的区别

    CMD CMD指令为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束.CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖. 类似于 RUN 指令,用于运行程 ...

  3. Dockerfile中CMD和ENTRYPOINT命令详解

    原文:https://m.jb51.net/article/136264.htm Dockerfile中CMD和ENTRYPOINT命令详解 发布时间:2018-03-12 11:46:00 作者:s ...

  4. Dockerfile中CMD和ENTRYPOINT区别

    CMD指令和ENTRYPOINT指令的作用都是为镜像指定容器启动后的命令,那么它们两者之间有什么各自的优点呢? 为了更好地对比CMD指令和ENTRYPOINT指令的差异,我们这里再列一下这两个指令的说 ...

  5. cmd与entrypoint的区别

    前言 环境:centos7.9 docker version 20.10.14 在Dockerfile中最容易让人混淆的是CMD和ENTRYPOINT这两个指令,本篇我们来介绍这两个指令的用法和区别. ...

  6. Dockerfile脚本:CMD与ENTRYPOINT的区别

    CMD & ENTRYPOINT ENTRYPOINT使用 FROM centos RUM yum install -y curl #ENTRYPOINT ["curl", ...

  7. 【网址收藏】Docker中ADD和COPY的区别

    https://www.zhihu.com/tardis/sogou/art/452373112

  8. Dockerfile文件中CMD指令与ENTRYPOINT指令的区别

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  9. docker——cmd和entrypoint

    目录 1.copy和add的区别 2.cmd和entrypoint的区别 exec模式与shell模式 3.exec模式和shell模式 小实验 exec模式 使用exec模式无法输出环境变量 she ...

  10. DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER

    文章目录 ①. DockerFile是什么? ②. DockerFile构建过程解析 ③. 保留字指令 ①. FROM 基于哪个镜像 ②. LABEL 镜像的说明信息 ③. RUN 构建时期运行的指令 ...

最新文章

  1. 漫谈设计模式--3分钟理解桥接模式:笔和画的关系
  2. Python 执行代码的两种方式
  3. 并发、并行、线程、进程与CPU基本概念
  4. unity 打开项目路径无效_unity3d建立的文件有中文路径,现在新建了项目打不开了...
  5. 静态方和和实例方法的区别
  6. eo是什么?一份没有满分的试题
  7. 基于RV1126平台imx291分析 --- open及media graph分析
  8. 【产品】外壳防护等级(IP代码)
  9. ai自动生成字幕软件有哪些?自动生成字幕软件推荐!
  10. HTML+CSS+JS新年倒计时(实时更新)
  11. 等保备案和通信网络单元定级备案的五大区别讲解
  12. 安卓开发学习5-6:布局管理器:布局管理器嵌套
  13. matlab识别中国象棋棋盘,c – 使用OpenCV在棋盘中检测中国象棋棋子
  14. 如何删除剽悍的应用软件
  15. Unity:编辑器Editor常用命令
  16. django序列化drf2
  17. onscroll在移动端的使用
  18. 【嵌入式工程师的30岁总结】 真实
  19. Verilog转电路图
  20. SBT下载特别慢的问题解决

热门文章

  1. 双机高可用、负载均衡、MySQL (读写分离、主从自动切换)架构设计
  2. 软件架构入门,看这篇就够了···
  3. 盘点当下稳定又好用的远程控制方案,软硬全覆盖
  4. mysql索引和事务_mysql的索引和事务详细解读
  5. Nginx使用GeoIP模块来限制地区访问
  6. python 逻辑运算的短路问题
  7. 使用js切割URL的参数
  8. SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  9. poj 2499第K短路模板
  10. 结对项目---万年历