zoukankan      html  css  js  c++  java
  • Dockerfile RUN,CMD,ENTRYPOINT命令区别

    原文:https://www.jianshu.com/p/f0a0f6a43907

    Dockerfile中RUN,CMD和ENTRYPOINT都能够用于执行命令,下面是三者的主要用途:

    • RUN命令执行命令并创建新的镜像层,通常用于安装软件包
    • CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
    • ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

    Shell格式和Exec格式运行命令

    我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:

    • Shell格式:<instruction> <command>。例如:apt-get install python3
    • Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]

    CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。

    Run命令

    RUN 指令通常用于安装应用和软件包。RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。下面是一个例子:

    RUN apt-get update && apt-get install -y   
     bzr 
     cvs 
     git 
     mercurial 
     subversion
    

    apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。

    CMD命令

    CMD 指令允许用户指定容器的默认执行的命令。此命令会在容器启动且 docker run 没有指定其他命令时运行。下面是一个例子:

    CMD echo "Hello world"
    

    运行容器 docker run -it [image] 将输出:

    Hello world
    

    但当后面加上一个命令,比如 docker run -it [image] /bin/bash,CMD 会被忽略掉,命令 bash 将被执行:

    root@10a32dc7d3d3:/#
    

    ENTRYPOINT命令

    ENTRYPOINT 的 Exec 格式用于设置容器启动时要执行的命令及其参数,同时可通过CMD命令或者命令行参数提供额外的参数。ENTRYPOINT 中的参数始终会被使用,这是与CMD命令不同的一点。下面是一个例子:

    ENTRYPOINT ["/bin/echo", "Hello"]  
    

    当容器通过 docker run -it [image] 启动时,输出为:

    Hello
    

    而如果通过 docker run -it [image] CloudMan 启动,则输出为:

    Hello CloudMan
    

    将Dockerfile修改为:

    ENTRYPOINT ["/bin/echo", "Hello"]  
    CMD ["world"]
    

    当容器通过 docker run -it [image] 启动时,输出为:

    Hello world
    

    而如果通过 docker run -it [image] CloudMan 启动,输出依旧为:

    Hello CloudMan
    

    ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。

    总结

    • 使用 RUN 指令安装应用和软件包,构建镜像。
    • 如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。
    • 如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。

    参考文章



    作者:伊凡的一天
    链接:https://www.jianshu.com/p/f0a0f6a43907
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/wangmo/p/13043412.html
Copyright © 2011-2022 走看看