Docker中CMD,ENTRYPOINT命令区别,shell和Exec格式

CMD,ENTRYPOINT命令区别

  1. CMD: 启动容器后,提供默认命令及参数 (不一定会执行,只是默认) docker run 后面参数替换
  2. ENTRYPOINT: 启动容器时执行(一定会执行)
  3. /* 例如: Dockerfile 中:
  4. FROM centos //必须现有base镜像,否则Error:No build stage in current context
  5. RUN touch ceshi_cmd //run创建新镜像层,安装软件包
  6. CMD echo "hello with cmd"
  7. ENTRYPOINT echo "hello with entrypoint"
  8. */
  9. docker run -it this //运行 显示 ENTRYPOINT的内容
  10. // ENTRYPOINT一定会执行,没有enrtypoint则会执行 cmd的内容
  11. //cmd 作为默认选项 ,如果run it 带参数,则cmd不会执行

CMD的使用

  1. CMD 指令允许用户指定容器的默认执行的命令。
  2. 三种格式:
  3. Excel: CMD ["executable","param1","param2"]
  4. ExceL参数:CMD ["param1","param2"] //用来为ENTRYPOINT 提供参数,此时entrypoint必须用Exce
  5. Shell: CMD command param1 param2
  6. 例:
  7. /*
  8. CMD echo "Hello world"
  9. // docker run -it [image] 输出: Hello World
  10. // docker run -it [image] /bin/bash 此时会进入 /bin/bash命令,忽视cmd
  11. // docker run -it [image] “param" 加参数会出现错误
  12. */

图例:
ENTRYPOINT的使用

  1. ENTRYPOINT :
  2. Exec格式 用使用CMD的参数,run [image] 会替代CMD参数,会使用 run 中的多个参数
  3. 例:
  4. /*
  5. ENTRYPOINT ["/bin/echo", "Hello"]
  6. CMD ["world"] //表示默认参数,没提供参数,则使用此参数
  7. docker run -it [image] 输出:Hello world
  8. docker run -it [image] "hanke" 输出 Hello hanke ,不使用默认参数
  9. docker run -it [image] "hanke" "hujing" 输出 Hello hankd hujing 使用多个提供参数
  10. */
  11. Shell格式 :不会使用 CMD参数,run [image] 参数

图例: //entrypoint 使用参数
//entrypoint不使用cmd参数和[image]参数
shell和Exec格式

  1. Shell格式Example: Exec格式Example
  2. RUN apt-get install python3 RUN ["apt-get", "install", "python3"]
  3. CMD echo "Hello world" CMD ["/bin/echo", "Hello world"]
  4. ENTRYPOINT echo "Hello world" ENTRYPOINT ["/bin/echo", "Hello world"]
  5. Sheel格式中的命令会直接被sheel解析:
  6. Exec格式不会直接解析,需要加参数
  7. 例:
  8. ENV name Cloud Man
  9. ENTRYPOINT ["/bin/echo", "Hello, $name"] //输出 Hello,Cloud Man
  10. ENV name Cloud Man
  11. ENTRYPOINT ["/bin/sh","echo Hello, $name"] //输出 Hello,$name
  12. ["/bin/sh","-c","echo Hello, $name"] //输出 /bin/sh:Hello,Cloud Man Command not found
  13. Warming:
  14. CMD ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解
  15. RUN 则两种格式都可以。