1. 前言

 ENTRYPOINT 和CMD 都是Dockerfile 中的命令,两者都是用来:指定默认的容器的主进程的启动命令。那么接下来就介绍一下这两者在Dockerfile 中,以及Docker中的如何使用,以及区别和联系。

2. CMD 命令

 首先介绍一下 CMD 命令,命令分为两种格式, 一种是shell,另一种是 exec

  • shell : CMD <命令>
  • exec: CMD ["可执行文件","参数1","参数2"...]

  既然 CMD 命令是用来指定默认的容器的主进程的启动命令的,那么我们就可以用新的命令来替代这个命令啦。
当我们直接输入docker run --rm -it ubuntu:14.04 的时候,是默认进入Bash 的,如下图所示:

那么如果我们想换一种方式,那么怎么办呢,很简单。我们自己构建一个镜像来演示(基于ubuntu:14.04)。
假如我们想一运行镜像,就输出一条信息,“Hello,Robert!”
Dockerfile 中如下所示:

保存退出后,我们输入命令docker build -t cmddemo . 构建镜像,
然后运行 docker run --rm cmddemo
发现控制台输出 Hello,Robert!
运行成功。


2.1 注意1

在指令格式上,一般推荐使用exec 格式,这类格式在解析时 会被解析成JSON数组,因此一定要用双引号,而不要使用单引号。
如果使用Shell 格式的话,实际执行中,会被转换成exec 命令。比如
CMD echo hello
转换成
CMD ["sh", "-c" , "echo 'hello'"]

2.2 注意2

 Docker 不是虚拟机,容器中的应用都应该前台执行,而不是像虚拟机,物理机里面那样,用upstart和systemd 去启动后台程序。容器中没有后台服务的概念。

3. ENTRYPOINT 命令

  ENTRYPOINT和 CMD 格式一样,分为shell 和exec 两种格式。 ENTRYPOINT 和CMD 的目的一样,都是指定容器启动程序及其参数。当指定ENTRYPOINT后, CMD的含义就发生了改变,不再是直接运行其命令,而是将CMD的内容作为参数 传给ENTRYPOINT ,换句话说实际执行就变成了如下
<ENTRYPOINT> "<CMD>"

其实ENTRYPOINT 用起来和CMD差不多,但是还麻烦点,麻烦有麻烦的好处。

Dockerfile 中的代码如下:

然后在构建完,运行可看见如下:

接下来讲述CMD 和ENTRYPOINT配合起来使用的。
Dockerfile 中如下:

然后构建运行,得到

运行 docker run --rm demo "echo 'Hello,Audience!'" 则会把CMD 中的内容直接替换掉,结果如下图所示:

4.参考链接

  1. https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/

Docker入门之---ENTRYPOINT和CMD的更多相关文章

  1. CMD centos7 安装 最新版本的docker -- dockerfire 原语 ENTRYPOINT - 导入镜像 tar mariadb Dockerfile 构建镜像

    yum update # vim /etc/yum.repos.d/docker.repo //添加以下内容 [dockerrepo] name=Docker Repository baseurl=h ...

  2. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  3. Docker入门之七Dockerfile

    Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像.首先我们可以先看一个dockerfile是什么样子.这里可以有一个网站不错:http://dockerfile.github ...

  4. 这可能是最为详细的Docker入门吐血总结

    这可能是最为详细的Docker入门吐血总结  https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...

  5. Docker入门学习总结

    1. 什么是Docker Docker是一种虚拟化技术,其在容器的基础上进一步封装了文件系统.网络互联.进程隔离等等,从而极大地简化了容器的创建和维护.Docker使用 Google 公司推出的 Go ...

  6. Docker 入门指南——部署常用服务示例

    MongoDB FROM centos:centos7 MAINTAINER The CentOS Project <cloud-ops@centos.org> RUN yum -y up ...

  7. Docker 入门 之基本命令

    3 Docker 入门 首先确保docker 已成功安装在Linux 或windows 系统中 我们可以使用 docker info 查看docker是否成功安装和正常运行 运行我们第一个docker ...

  8. redis哨兵集群、docker入门

    redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...

  9. Docker 入门基础

    Docker是一个能把开发的应用程序自动部署到容器的开源引擎.Docker是新的容器化技术,轻巧,易移植[Build Once, Configure Once And Run Anywhere].Do ...

随机推荐

  1. 【Nginx系列】Nginx虚拟主机的配置核日志管理

    Nginx配置段 #user nobody; worker_processes 1;// 有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数 #error_lo ...

  2. C语言第二次作业

    一.PTA实验作业 题目1:7-1 计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if (x>=0) { y=sqrt( ...

  3. mongodb 集群分片

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,这 ...

  4. 位图(BitMap)

    位图 引入:2.给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. [腾讯] 思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间. 分 ...

  5. Packet for query is too large (84 > -1).

    windows下的resin配置连接mysql,常用的安全的做法是将数据库信息配置到conf目录下的resin.xml文件中. 因为resin连接mysql不是必须的,所以resin本身没有提供mys ...

  6. 数据结构与算法 —— 链表linked list(01)

    链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...

  7. JAVA_SE基础——8.基本数据类型

    基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...

  8. 关于win10系统1709版本安装JDK出现变量配置正确但仍有“java不是内部或外部命令”的解决办法

    背景:联想拯救者R720笔记本,系统一键还原了,需要重新安装一部分软件,最基本的就是JDK,但今天在安装时遇到了问题,之前安装的1.8版本,没有仔细配置环境变量,这一次安装的是1.7版本的,仔仔细细配 ...

  9. WebApi 的三种寄宿方式 (一)

    最近逛博客园,看到了Owin,学习了一下,做个笔记,说不定将来哪天就用上了 关于 Owin 的介绍,百度解释的很清楚了: https://baike.baidu.com/item/owin/28607 ...

  10. 新概念英语(1-105)Full Of Mistakes

    Lesson 105 Full of mistakes 错误百出 Listen to the tape then answer this question. What was Sandra's pre ...