• ENTRYPOINT 与 CMD


    在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 80
    EXPOSE 81
    CMD ["/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.1503
    
    CMD ["/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 80
    ENTRYPOINT ["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 中写错的指令

  • 相关阅读:
    考研复试之dp重温
    面试总结
    决策树学习记录
    python机器学习随笔
    大三狗重新复习算法之递推
    第十二届CSP总结
    unity(Exploder插件)研究
    unity学习笔记2
    Unity3d学习笔记(持续更新)。。。
    4.24
  • 原文地址:https://www.cnblogs.com/wq3435/p/6487185.html
Copyright © 2020-2023  润新知