• Dockerfile命令RUN、CMD、ENTRYPOINT的区别


    RUN

    RUN命令是构建镜像时执行的命令,属于创建Docker镜像(image)的步骤。一个Dockerfile中可以有许多个RUN命令。

    例如:

    RUN yum install -y telnet
    RUN touch web.xml

    CMD

    CMD命令是构建容器后调用,也就是在容器启动时才进行调用。一个Dockerfile仅仅最后一个CMD起作用。

    格式:
        CMD ["executable","param1","param2"] (运行一个可执行的文件并提供参数)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数,即为ENTRYPOINT指定参数)
        CMD command param1 param2 (执行shell内部命令)
    示例:
        CMD echo "This is a test." | wc -
        CMD ["/usr/bin/wc","--help"]注:   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

    如你指定:

    CMD ["/bin/echo", "this is a echo test"]

    build后运行(假设镜像名为ec):

    docker run ec

    就会输出: this is a echo test

    是不是感觉很像开机启动项,你可以暂时这样理解。

    注意点:

    但是如果在docker run后添加其他指令。那么CMD将直接被替换。

    如:

    docker run -it ubuntu /bin/bash

    就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。

    又比如下面这个Dockerfile文件:

    FROM busybox
    CMD echo "hello world"

    CMD指明了Docker镜像在运行时的输出一个"hello world"

    [root@bochs Docker]# docker build -t test .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM busybox
     ---> 83aa35aa1c79
    Step 2/2 : CMD echo "hello world"
     ---> Running in a1a4d74137d2
    Removing intermediate container a1a4d74137d2
     ---> 651b45b58fe9
    Successfully built 651b45b58fe9
    Successfully tagged test:latest
    [root@bochs Docker]# docker run -it test hello world

    但是如果在docker run后添加其他指令。那么CMD将直接被替换

    [root@bochs Docker]# docker run -it test ls
    bin   dev   etc   home  proc  root  sys   tmp   usr   var

    ENTRYPOINT

    ENTRYPOINT与CMD类似,区别在于ENTRYPOINT一定会被执行。如果一个Dockerfile中同时存在ENTRYPOINT和CMD,CMD中的参数会被当做额外参数传给ENTRYPOINT。

    [root@bochs Docker]# cat Dockerfile 
    FROM busybox
    ENTRYPOINT ["/bin/echo","hello"]
    CMD ["world"]

    通过docker run 来运行,CMD变成了ENTRYPOINT的参数:

    [root@bochs Docker]# docker run -it test2 
    hello world

    但是如果指明docker run 的参数china,那么输出就会变为:

    [root@bochs Docker]# docker run -it test2 china
    hello china

    原本CMD中带的参数world被docker run中的china所替换,但ENTRYPOINT自带的hello依然正常输出

    Shell与Exec格式

    CMD,RUN,ENTRYPOINT可以用两种格式来传递命令和参数,Shell一般表示为指令+命令,如:

    RUN yum install -y telnet
    CMD echo "hello world"

    第一个大写的单词是Dockerfile的指令。后面跟的就是命令,可以拿到shell中单独执行

    Exec格式可以表示为:指令+["命令","命令参数1","命令参数2",...],比如:

    RUN ["yum","install","telnet"]
    ENTRYPOINT ["/bin/bash","-c","echo hello world"]

    对于这两种格式来说,CMD和ENTRYPOINT最好使用Exec格式,命令和参数分开,层次性较强,而RUN则都可以

    注意:ENTRYPOINT的Shell格式和Exec格式差异很大

    比如下面这个Shell格式的ENTRYPOINT

    FROM busybox
    ENTRYPOINT echo "hello"
    CMD "world"

    在运行所生成的容器时,仅会输出hello,而CMD带的"world"会被忽略。同样的docker run带的参数也同样会被忽略

    [root@bochs Docker]# docker run -it test
    hello
    [root@bochs Docker]# docker run -it test china
    hello

    参考文章:

    Dockerfile文件详解

    Dockerfile 的 RUN 和 CMD、ENTRYPOINT

    Dockerfile中RUN CMD以及ENTRYPOINT的区别

  • 相关阅读:
    从零开始学VUE3.X-常用模版语法
    从零开始学3.X-生命周期函数
    从零开始学TypeScript-readonly
    从零开始学Typescript-基础类型
    从零开始学Typescript-webpack打包
    探索 .NET Core 依赖注入的 IServiceProvider
    在.NET Core 中使用 FluentValidation 进行规则验证
    盘点大厂的那些开源项目
    探索 .NET Core 依赖注入的 IServiceCollection
    使用 Benchmark.NET 测试代码性能
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14440018.html
Copyright © 2020-2023  润新知