Docker入门之---ENTRYPOINT和CMD

1. 前言

ENTRYPOINTCMD 都是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 中如下所示:

Screen Shot 2017-06-26 at 20.21.50.png

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

Screen Shot 2017-06-26 at 20.24.39.png


2.1 注意1

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

2.2 注意2

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

3. ENTRYPOINT 命令

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

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

Dockerfile 中的代码如下:

Screen Shot 2017-06-26 at 21.08.20.png

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

Screen Shot 2017-06-26 at 21.09.12.png

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

Screen Shot 2017-06-26 at 21.09.12.png

然后构建运行,得到

Screen Shot 2017-06-26 at 21.15.59.png

运行 docker run --rm demo "echo 'Hello,Audience!'" 则会把CMD 中的内容直接替换掉,结果如下图所示:
Screen Shot 2017-06-26 at 21.17.04.png

4.参考链接

  1. https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/
posted @ 2017-06-26 17:31  BUTTERAPPLE  阅读(1331)  评论(0编辑  收藏  举报