在Dockerfile中 ENTRYPOINT 只有最后一条生效,如果写了10条,前边九条都不生效

ENTRYPOINT 的定义为运行一个Docker容器像运行一个程序一样,就是一个执行的命令

两种写法:

1.ENTRYPOINT["executable","param1","param2"]  类似于exec

2.ENTRYPOINT command param1 param2(shell form)

第一种方式启动完PID号为1,第二种方式启动完PID号为最后执行完shell的PID号

CMD

部分内容转自:http://www.cnblogs.com/51kata/p/5260727.html

通过docker run 创建并启动一个容器时,命令的最后可以指定容器启动后在容器内立即要执行的指令,如:

docker run -i -t ubunu /bin/bash   //表示容器启动时立即在容器内打开一个shell终端

docker run ubuntu /bin/ps    //表示容器启动后立即运行 /bin/ps命令,显示容器的当前进程。

除了这种方式外,我们可以在dockerfile文件中通过CMD指令指定容器启动时要执行的命令。如:

#test

FROM ubuntu

MAINTAINER xxx

RUN echo hello1 >test1.txt

RUN echo hello2 > /test2.txt

EXPOSE 80EXPOSE 81CMD ["/bin/bash"]

上面dockerfile文件中最后一行CMD指令的参数是指定容器启动时要执行的命令,这里是bin/bash命令。

1、用docker run命令创建并启动容器(myimage  是用前面dockerfile创建的镜像的名称):

docker run -i -t myimage

上面命令是创建并启动容器,打开一个交互式shell。 而以前的写法是

docker run -i -t myimage  /bin/bash

这样就省去了在docker run中写命令了。

2、即使dockerfile中有CMD指令,我们仍然可以在docker run命令中带上容器启动时执行的命令,这会覆盖dockerfile中的CMD指令指定的命令。如:

docker run -i -t myimage /bin/ps

上面命令,因为/bin/ps覆盖了CMD指令,启动容器时会打印容器内的当前进程,但容器会立即停止,因为/bin/bash被覆盖了,无法打开交互式shell界面。

3、需要注意的是,dockerfile中可以有多条cmd命令,但只是最后一条有效。

4、CMD命令的参数格式,一般写成 字符串数组的方式,如上面的例子。如:

CMD  ["echo","hello world"]

虽然也可写成CMD echo hello word 方式,但这样docker会在指定的命令前加  /bin/sh -c 执行,有时有可能会出问题。 所以推荐采用数据结构的方式来存放命令。

1.CMD["executable","param1","param2"](exec form,this is the preferred form)

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

2.CMD["param1","param2"](as default parameters to ENTRYPOINT)

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

3.CMD command param1 param2(shell form)

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

在启动 docker时候 后边加的参数可以把 Dockerfile 中 CMD中的指令覆盖掉!

写一个Dockerfile

vim Dockerfile

FROM centos:centos7.1.1503CMD ["/bin/echo","This is test cmd"]

将Dockerfile生成一个镜像

docker build -t csphere/cmd:0.1 .

将镜像run为容器

docker run -it csphere/cmd:0.1

打印:This is test cmd

采用如下run 加入参数时:

docker run -it csphere/cmd:0.1 /bin/bash

会直接进入Container里边,不会打印语句,/bin/bash 将/bin/echo 覆盖掉了

然而使用 ENTRYPOINT 时是不能被覆盖掉

ENTRYPOINT

先回顾下CMD指令的含义,CMD指令可以指定容器启动时要执行的命令,但它可以被docker run命令的参数覆盖掉。

ENTRYPOINT 指令和CMD类似,它也可用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。

这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。

可以看出,相对来说ENTRYPOINT指令优先级更高。

我们来看个例子,下面是Dockerfile的内容

#test

FROM ubuntu

MAINTAINER hello

RUN echo hello1 >test1.txt

RUN echo hello2 > /test2.txt

EXPOSE 80ENTRYPOINT ["echo"]

CMD ["defaultvalue"]

假设通过该Dockerfile构建的镜像名为 myimage。

1、当运行 docker run myimage  输出的内容是 defaultvalue,可以看出CMD指令的参数得确是被添加到ENTRYPOINT指令的后面,然后被执行。

2、当运行docker run myimage hello world  输出的内容是 hello world ,可以看出docker run命令的参数得确是被添加到ENTRYPOINT指令的后面,然后被执行,这时CMD指令被覆盖了。

3、另外我们可以在docker run命令中通过 --entrypoint 覆盖dockerfile文件中的ENTRYPOINT设置,如:

docker run --entrypoint="echo" myimage good  结果输出good

注意,不管是哪种方式,创建容器后,通过 dokcer ps查看容器信息时,COMMOND列会显示最终生效的启动命令。

将上述Dockerfile中的CMD 修改为 ENTRYPOINT

同样执行:

docker run -it csphere/cmd:0.1 /bin/bash

输出:

This is test entrypoint /bin/bash

如果想要覆盖掉Dockerfile中的 ENTRYPOINT 指令,则可以使用如下命令

docker run -it --entrypoint=/bin/bash csphere/ent:0.1

方便调试ENTRYPOINT 中写错的指令

java entrypoint_ENTRYPOINT 与 CMD相关推荐

  1. java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...

    解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没 ...

  2. 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行

    标题使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1.在电脑桌面使用快捷键win+r打开 2.打开cmd命令界面之后使用md d ...

  3. java start打开cmd窗口并停住_浅析Java命令执行

    在使用java.lang.Runtime#exec()执行命令时,为何有时候命令前缀需要加cmd /c或者bash -c?今天就来一探究竟! Java执行命令的3种方法 首先了解下在Java中执行命令 ...

  4. java 模拟 cmd_用JAVA模拟实现CMD命令行

    时间:2019-07-14 概述:CMD 控制台 命令行 用JAVA模拟Windows的CMD命令控制台程序,内置了一些常用命令,当然功能不能和真正的CMD控制台相比了,只是告诉大家实现的思路,若你肯 ...

  5. IDEA清空控制台以及Java中运行cmd命令实现清屏操作

    文章目录 IDEA中清空控制台方法 解决办法: 一:打印换行 二:通过按键事件控制键盘执行清空控制台动作 三:附:Java 按键事件 KeyEvent 四:使用鼠标箭头触发按钮实现清空控制台操作 Wi ...

  6. 【java】使用cmd运行java程序

    做作业时,有这样一道题: 在命令行状态下,如果命令"java Hello"成功运行了程序并打印出Hello world,那么下面哪个叙述是错误的?(  ) A) 当前目录中一定存在 ...

  7. java怎么在cmd运行_怎么在cmd里面运行 java

    方法如下: 设备i/o包中的程序需要使用设备dev包中的程序cmd 运行 命令,而设备dev包中的程序需要调用ecos的硬件抽象层包中的底层接口函数,如图3所示.由于jstatd需要保持一直运行,所以 ...

  8. [转]Java 程序调用cmd命令

    由于不知道确切的作者,所有在此不写转自哪里了,但是非常感谢作者. java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是 ...

  9. java程序在cmd中运行的一些细节

    快开学了,这个学期学<高级语言程序设计>是java,开学前呢,自己接触过一些java的程序(上次在省赛的时候还用java成功A了一题,呵呵).以前一直用的是eclipse,现在突然看看书上 ...

最新文章

  1. 使用python抓取百度漂流瓶妹纸照片
  2. C#编程利器系列文章
  3. go语言学习(一)——go语言简介和环境搭建
  4. 前沿 | 全球最具影响力开源数据库峰会开幕在即 阿里云精彩议题先睹为快
  5. 玩转12306之系统登录
  6. html中隐式转换成数字,详解JS中的隐式类型转换
  7. 诺基亚100G光传输网络助力Jio泛印度4G网络大幅增长
  8. 第一次作业 三班20
  9. 墙面有几种装修方法_卧室装修静音环保攻略,赶紧收藏起
  10. 计算机网络自顶向下-第 8 版
  11. 记录一下matlab画雷达图
  12. 皮德常《c++程序设计教程》第一章第二题:编写一个程序,要求用户输入一年12个月每月的降雨总数,并用一个float数组存储。
  13. 玩寻仙一个月之我感受
  14. 机器学习入门好文,强烈推荐(转载)
  15. 只查看ett.txt文件(100行)内第20行到30行的内容
  16. 读取EL1809模块输入信号
  17. JAVA郑财校园新闻管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  18. eclipse官方下载32位和64位的具体步骤
  19. ac2100 反弹shell无法粘贴_【1029精简稳定版OpenWrt】红米&小米AC2100|帕斯沃|多拨|SmartD...
  20. 全球及中国口腔医疗行业投融资现状与与运营效益分析报告2022版

热门文章

  1. 华为,腾讯,北电,用友,神州,群硕,招聘,应聘,待遇
  2. ps自由变化快捷键,取消选区。如何取消钢笔工具的选区
  3. 国外路由器用户名和密码(默认)(下)
  4. 017ssm电子病历管理系统医院管理系统java
  5. linux中的last命令,在Linux系统中使用Last命令的方法,包括Last命令选项说明
  6. 基于灰色关联度的人均GDP影响因数分析
  7. 8.13无限火力服务器维护到什么时候,8.13无限火力再度来袭!最高等级达到30级?...
  8. 在线VIM编辑器模拟工具
  9. 鸿蒙os 2.0玩吃鸡,华为鸿蒙OS2.0[敏感词汇屏蔽]能简测:极致画质下的吃鸡王者更胜EMUI11...
  10. 更改开发者账号中的公司名称, 也就是苹果商店显示的开发商名称