Docker中CMD,ENTRYPOINT命令区别,shell和Exec格式
CMD,ENTRYPOINT命令区别
CMD: 启动容器后,提供默认命令及参数 (不一定会执行,只是默认) 会docker run 后面参数替换ENTRYPOINT: 启动容器时执行(一定会执行)/* 例如: Dockerfile 中:FROM centos //必须现有base镜像,否则Error:No build stage in current contextRUN touch ceshi_cmd //run创建新镜像层,安装软件包CMD echo "hello with cmd"ENTRYPOINT echo "hello with entrypoint"*/docker run -it this //运行 显示 ENTRYPOINT的内容// ENTRYPOINT一定会执行,没有enrtypoint则会执行 cmd的内容//cmd 作为默认选项 ,如果run it 带参数,则cmd不会执行
CMD的使用
CMD 指令允许用户指定容器的默认执行的命令。三种格式:Excel: CMD ["executable","param1","param2"]ExceL参数:CMD ["param1","param2"] //用来为ENTRYPOINT 提供参数,此时entrypoint必须用ExceShell: CMD command param1 param2例:/*CMD echo "Hello world"// docker run -it [image] 输出: Hello World// docker run -it [image] /bin/bash 此时会进入 /bin/bash命令,忽视cmd// docker run -it [image] “param" 加参数会出现错误*/
图例:
ENTRYPOINT的使用
ENTRYPOINT :Exec格式 用使用CMD的参数,run [image] 会替代CMD参数,会使用 run 中的多个参数例:/*ENTRYPOINT ["/bin/echo", "Hello"]CMD ["world"] //表示默认参数,没提供参数,则使用此参数docker run -it [image] 输出:Hello worlddocker run -it [image] "hanke" 输出 Hello hanke ,不使用默认参数docker run -it [image] "hanke" "hujing" 输出 Hello hankd hujing 使用多个提供参数*/Shell格式 :不会使用 CMD参数,run [image] 参数
图例: //entrypoint 使用参数
//entrypoint不使用cmd参数和[image]参数
shell和Exec格式
Shell格式Example: Exec格式Example:RUN apt-get install python3 RUN ["apt-get", "install", "python3"]CMD echo "Hello world" CMD ["/bin/echo", "Hello world"]ENTRYPOINT echo "Hello world" ENTRYPOINT ["/bin/echo", "Hello world"]Sheel格式中的命令会直接被sheel解析:而Exec格式不会直接解析,需要加参数例:ENV name Cloud ManENTRYPOINT ["/bin/echo", "Hello, $name"] //输出 Hello,Cloud ManENV name Cloud ManENTRYPOINT ["/bin/sh","echo Hello, $name"] //输出 Hello,$name["/bin/sh","-c","echo Hello, $name"] //输出 /bin/sh:Hello,Cloud Man Command not foundWarming:CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解RUN 则两种格式都可以。
