• 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/
  • 相关阅读:
    63.C++异常
    62.C++文件操作list实现内存检索,实现两千万数据秒查
    61.C++文件操作实现硬盘检索
    ios之数据持久化
    ios NSRange
    安排
    接口隔离原则
    Liskon替换原则
    开放封闭原则
    单一职责原则
  • 原文地址:https://www.cnblogs.com/xiyin/p/7081577.html
Copyright © 2020-2023  润新知