zoukankan      html  css  js  c++  java
  • Dockerfile中ENTRYPOINT 和 CMD的区别

    在Docker的系统学习教程中我们了解到使用Dockerfile构建Docker镜像为一个规范的方式,根据Dockerfile可以了解镜像中安装的组件的详细内容。Dockerfile一般由四部分组成:第一,构建的基础镜像;第二,镜像构建者的信息;第三,构建镜像过程中镜像层添加指令;第四,由该镜像启动容器时执行的程序。本篇文章中涉及到的ENTRYPOINT 和CMD 属于Dockerfile中的最后一部分,这两个Dockerfile指令是用来告知Docker后台程序启动镜像时需要执行的程序,两者有细微的差别。下面将从两者的异同以及两者联合使用的高级技巧方面对两个指令进行详解。

    CMD 指令

    CMD 指令指定容器启动时需要运行的程序。一般用最简单的方式启动一个容器时使用docker run 会传递参数给docker指令

    docker run -it image /bin/bash1
    

    后面的/bin/bash 其实是传递参数,告知容器启动时运行一个shell。这个过程可以用CMD 指令等效的替换

    CMD ['/bin/bash']1
    

    因此在Dockerfile中存在这个CMD指令指定的命令时,启动容器就可以不进行参数传递。

    docker run -it image 1
    

    执行效果一致。

    [root@MiWiFi-R3L-srv test]# docker run --name test -it test_image
    [root@3a1bb0c9e35c /]#12
    

    如果dockerfile中已经指定了容器启动时运行的程序,同时在使用docker run 启动容器时使用了命令行参数,那么dockerfile 中的cmd指令将无效

    docker run -it image /bin/ps1
    

    发现启动容器后没有shell ,只是打印出了当前容器中的进程状态,cmd 指令效果被覆盖。

      PID TTY          TIME CMD
        1 ?        00:00:00 ps
    [root@MiWiFi-R3L-srv test]#123
    

    此时可以看到cmd 效果被覆盖。在一个dockerfile中只有最后一个cmd 指令有效,因此一个dockerfile中只写一个cmd 指令。

    ENTRYPOINT 指令

    ENTRYPOINT 指令效果与CMD 非常的类似,比较容易混淆两者的功能。最大的区别在于使用的方式,ENTRYPOINT 指定的命令需要与docker run 启动容器进行搭配,将docker run 指令后面跟的内容当做参数作为ENTRYPOINT指令指定的运行命令的参数,ENTRYPOINT 指定的linux命令一般是不会被覆盖的。以nginx 镜像为例说明
    首先构建一个nginx镜像,并且指定容器运行时执行的程序为nginx。

    FROM centos
    MAINTAINER allocator
    RUN yum install -y nginx
    RUN echo 'hello world' > /usr/share/nginx/html/index.html
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx"]123456
    

    然后启动镜像

    docker run --name test -p 5000:80 -it test_nginx -g "daemon off"1
    

    后面两个是作为参数传递给nginx启动程序运行,此时nginx作为前台程序运行,是一个web服务器,可以根据外部绑定的端口,通过浏览器正常看到hello world

    两者联合使用技巧

    已经明白了两者的区别,可以利用两者的特点构建一个含有默认启动运行程序的镜像,并且支持docker run 启动时人为指定启动程序运行的参数。
    举个例子。利用ENTRYPOINT 指定启动时运行启动nginx程序,并给定默认的运行参数为显示帮助信息,dockerfile 构建如下:

    ENTRYPOINT ["/usr/sbin/nginx"]
    CMD ["-h"]12
    

    当使用docker run --name test -it test_nginx 不传递任何参数时,此时启动容器会使用cmd 指令后的命令作为默认参数,打印nginx的帮助信息。此时cmd 后的内容并不是一个完整的指令,而是参数,如果其内容是一个完整的指令,那么它将覆盖ENTRYPOINT中的内容。

    如果使用docker run --name test -it test_nginx -g "daemon off" 启动时,此时给定的运行参数会覆盖掉CMD 指令对应的内容,此时nginx将作为前台进程运行,作为一个web服务器使用,通过browser可以看到hello world

  • 相关阅读:
    java 判断是否满足正则表达式
    bootstrap-select多选框与Vue整合,下拉的数据刷新不出
    Windows 修改host文件不起作用
    【服务器】【tomcat】Tomcat 应用目录重定向
    【Spring】Spring装配Bean的顺序
    【Maven】m2e以原型创建Maven Project再次失败
    【Maven】m2eclipse以maven-archetype-quickstart原型创建Maven Project失败的解决
    【Java SE】jar xvf "path"命令
    【Java SE】形参被初始化为实参的值的拷贝
    【Java SE】斐波那契数列
  • 原文地址:https://www.cnblogs.com/wenqiangit/p/10298378.html
Copyright © 2011-2022 走看看