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

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

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

    一、Shell格式和Exec格式运行命令

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

    1、Shell格式:<instruction> <command>。例如:

    RUN apt-get install python3  
    CMD echo "Hello world"  
    ENTRYPOINT echo "Hello world"  

      当指令执行时,shell 格式底层会调用 /bin/sh -c <command>

    // 例如下面的 Dockerfile 片段:
    ENV name Cloud Man  
    ENTRYPOINT echo "Hello, $name" 
    
    // 执行 docker run <image> 将输出:
    Hello, Cloud Man 

      注意环境变量 name 已经被值 Cloud Man 替换

    2、Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如:

    RUN ["apt-get", "install", "python3"]  
    CMD ["/bin/echo", "Hello world"]  
    ENTRYPOINT ["/bin/echo", "Hello world"] 

      当指令执行时,会直接调用 <command>,不会被 shell 解析

    // 例如下面的 Dockerfile 片段:
    ENV name Cloud Man  
    ENTRYPOINT ["/bin/echo", "Hello, $name"]
    
    // 运行容器将输出:
    Hello, $name
    
    // 注意环境变量“name”没有被替换。如果希望使用环境变量,照如下修改
    ENV name Cloud Man  
    ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]
    
    // 运行容器将输出:
    Hello, Cloud Man 

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

    二、Run命令

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

    RUN apt-get update && apt-get install -y   
     bzr 
     cvs 
     git
      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:/#
      此命令会在容器启动且 docker run 没有指定其他命令时运行。

    1、如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。

    2、如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。

    四、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 的额外参数可以在容器启动时动态替换掉。

  • 相关阅读:
    百万级数据库优化方案
    MySQL架构及优化原理
    性能优化建议
    索引
    sql语句优化(持续更新)
    sql语句优化原理
    常用命令
    常见问题
    三、范围和生命周期
    【UVa】[11582]Colossal Fibonacci Numbers!
  • 原文地址:https://www.cnblogs.com/goloving/p/15139276.html
Copyright © 2011-2022 走看看