zoukankan      html  css  js  c++  java
  • 9.dockerfile之ENTRYPOINT指令

    一、ENTRYPOINT说明


    entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部

    每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效

    当定义了entrypoint以后,CMD只能够作为参数进行传递

    二、ENTRYPOINT指令优先级


    ENTRYPOINT 指令和CMD类似,也是用来指定容器启动时执行的命令,但ENTRYPOINT指令的优先级更高:

    1.启动容器命令不包含参数

    假设dockerfile同时存在ENTRYPOINT指令和CMD指令,那么容器启动时先执行ENTRYPOINT指令再执行CMD指令;

    2.启动容器命令包含参数

    假设dockerfile同时存在ENTRYPOINT指令和CMD指令,那么容器启动时先执行ENTRYPOINT指令再执行CMD指令,同时dockerfile内的CMD指令被覆盖;

    我们编写个dockerfile来验证上面两种情况:

    #Base image
    FROM centos
    
    #MAINTAINER,this dockerfile creater
    MAINTAINER loose@docker.com
    
    #entrypoint指令,配合下方的CMD指令内容在容器启动时输出:entrypoint and cmd
    ENTRYPOINT ["echo"]
    
    #CMD指令
    CMD ["entrypoint and cmd"]

    构建镜像:

    查看镜像:

    测试上方的条件1,根据镜像启动容器,启动命令不携带参数:

    测试结果:的确是entrypoint指令先执行,如果没有先执行,是无法输出CMD指令参数的!

    测试上方的条件2,根据镜像启动容器,启动命令携带参数,验证是否dockerfile文件内的CMD参数被覆盖:

    测试结果:dockerfile文件内的CMD参数被覆盖,并且启动容器参数一样是在entrypoint指令后执行。

    三、ENTRYPOINT在启动容器时动态替换


     我们还可以在docker run命令中通过 --entrypoint 覆盖dockerfile文件中的ENTRYPOINT参数,我们先修改下dockerfile,然后再构建镜像,最后通过启动命令来指定entrypoint指令参数:

    #Base image
    FROM centos
    
    #MAINTAINER,this dockerfile creater
    MAINTAINER loose@docker.com
    
    #CMD指令
    CMD ["by entrypoint"]

    构建后,镜像为:

    启动容器,手动执行entrypoint:

    再次启动容器,指定CMD参数:

    总结:

    可以使用--entrypoint="xx"外部指定ENTRYPOINT指令参数;

    同时,在外部指定ENTRYPOINT指令参数时CMD参数也必须在外部启动容器时指定。

  • 相关阅读:
    HDU 4681 STRING dp+暴力。
    HDU 4669 Mutiples on a circle 不知道该归为哪一类。
    poj 3411 Paid Roads很水的DFS
    poj 1724 ROADS 很水的dfs
    STL学习笔记(转,还是比较全的)
    4666 Hyperspace stl
    poj3308 Paratroopers 最大流 最小点权覆盖
    poj 3114 Countries in War
    2013 Multi-University Training Contest 4 部分解题报告
    2013 Multi-University Training Contest 3 部分解题报告
  • 原文地址:https://www.cnblogs.com/Json1208/p/8974164.html
Copyright © 2011-2022 走看看