• dockerfile案例二:CMD与ENTRYPOINT


    CMD与ENTRYPOINT

    相同点:都是指定一个容器启动时要运行的命令

    不同点:

    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。

    docker run 之后的参数会被当做参数追加给 ENTRYPOINT后的指令,之后形成新的命令组合。

    CMD会被替换:

    当我们正常启动一个tomcat容器

    [root@izbp13m488196e5hna361rz ~]# docker images tomcat
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    tomcat       latest    feba8d001e3f   2 months ago   649MB
    [root@izbp13m488196e5hna361rz ~]# docker run tomcat
    NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
    18-Feb-2021 10:27:35.371 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.41
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 3 2020 11:43:00 UTC
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.41.0
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-514.26.2.el7.x86_64
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.9.1+1
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
    18-Feb-2021 10:27:35.387 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat

    当我们添加额外指令,非正常启动一个tomcat容器

    [root@izbp13m488196e5hna361rz ~]# docker images tomcat
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    tomcat       latest    feba8d001e3f   2 months ago   649MB
    [root@izbp13m488196e5hna361rz ~]# docker run tomcat ls -l
    total 156
    -rw-r--r-- 1 root root 18982 Dec  3 11:48 BUILDING.txt
    -rw-r--r-- 1 root root  5409 Dec  3 11:48 CONTRIBUTING.md
    -rw-r--r-- 1 root root 57092 Dec  3 11:48 LICENSE
    -rw-r--r-- 1 root root  2333 Dec  3 11:48 NOTICE
    -rw-r--r-- 1 root root  3257 Dec  3 11:48 README.md
    -rw-r--r-- 1 root root  6898 Dec  3 11:48 RELEASE-NOTES
    -rw-r--r-- 1 root root 16507 Dec  3 11:48 RUNNING.txt
    drwxr-xr-x 2 root root  4096 Dec 18 08:58 bin
    drwxr-xr-x 2 root root  4096 Dec  3 11:48 conf
    drwxr-xr-x 2 root root  4096 Dec 18 08:57 lib
    drwxrwxrwx 2 root root  4096 Dec  3 11:43 logs
    drwxr-xr-x 2 root root  4096 Dec 18 08:57 native-jni-lib
    drwxrwxrwx 2 root root  4096 Dec 18 08:57 temp
    drwxr-xr-x 2 root root  4096 Dec 18 08:57 webapps
    drwxr-xr-x 7 root root  4096 Dec  3 11:45 webapps.dist
    drwxrwxrwx 2 root root  4096 Dec  3 11:43 work
    [root@izbp13m488196e5hna361rz ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@izbp13m488196e5hna361rz ~]# 

    当添加了命令 ls -l之后,tomcat容器并未启动,而是列出了tomcat路径下的所有目录

    原因在于,所有版本tomcat的dockerfile最后两句都是:

    EXPOSE 8080
    CMD ["catalina.sh", "run"]

    即最后启动tomcat容器,而当我们添加了ls -l后,CMD 会被 docker run 之后的参数替换,catalina.sh不会被执行,ls -l被执行。

    ENTRYPOINT会被追加

    编写dockerfile:

    FROM centos
    RUN yum install -y curl
    ENTRYPOINT [ "curl", "-s", "cip.cc" ]

    基础镜像为centos,安装curl命令,运行命令curl -s cip.cc

    build构建镜像:

    [root@izbp13m488196e5hna361rz mydocker]# docker build -f ./dockerfile3 -t myip .
    Sending build context to Docker daemon  4.096kB
    Step 1/3 : FROM centos
     ---> 300e315adb2f
    Step 2/3 : RUN yum install -y curl
     ---> Running in 8fd10027cbdb
    CentOS Linux 8 - AppStream                      1.1 MB/s | 6.3 MB     00:05    
    CentOS Linux 8 - BaseOS                         258 kB/s | 2.3 MB     00:09    
    CentOS Linux 8 - Extras                         4.2 kB/s | 8.6 kB     00:02    
    Package curl-7.61.1-14.el8.x86_64 is already installed.
    Dependencies resolved.
    ================================================================================
     Package               Architecture Version                  Repository    Size
    ================================================================================
    Upgrading:
     curl                  x86_64       7.61.1-14.el8_3.1        baseos       353 k
     libcurl-minimal       x86_64       7.61.1-14.el8_3.1        baseos       285 k
    
    Transaction Summary
    ================================================================================
    Upgrade  2 Packages
    
    Total download size: 638 k
    Downloading Packages:
    (1/2): libcurl-minimal-7.61.1-14.el8_3.1.x86_64 227 kB/s | 285 kB     00:01    
    (2/2): curl-7.61.1-14.el8_3.1.x86_64.rpm        251 kB/s | 353 kB     00:01    
    --------------------------------------------------------------------------------
    Total                                           283 kB/s | 638 kB     00:02     
    CentOS Linux 8 - BaseOS                         1.6 MB/s | 1.6 kB     00:00    
    
    。。。。。。。。

    运行容器:

    [root@izbp13m488196e5hna361rz mydocker]# docker images myip
    REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
    myip         latest    ddf86cfd673c   5 minutes ago   243MB
    [root@izbp13m488196e5hna361rz mydocker]# docker run myip 
    IP      : 8.136.11.41
    地址    : 中国  中国
    
    数据二  : 中国 | 阿里云
    
    数据三  : 
    
    URL     : http://www.cip.cc/8.136.11.41

    最后运行了 crul -s cip.cc 打出了ip,那如果还需要得到请求头的信息,我们可以追加 -i 参数

    [root@izbp13m488196e5hna361rz mydocker]# docker images myip
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    myip         latest    5f17f33fc659   13 seconds ago   243MB
    [root@izbp13m488196e5hna361rz mydocker]# docker run myip -i
    HTTP/1.1 200 OK
    Server: openresty
    Date: Thu, 18 Feb 2021 11:36:16 GMT
    Content-Type: text/html; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Vary: Accept-Encoding
    X-cip-c: H
    
    IP      : 8.136.11.41
    地址    : 中国  中国
    
    数据二  : 中国 | 阿里云
    
    数据三  : 中国 | 阿里巴巴
    
    URL     : http://www.cip.cc/8.136.11.41

    相当于容器启动时,运行了这个命令: curl -s  cip.cc -i

    因为ENTRYPOINT可以追加命令参数,所以在功能上比CMD要强大一些。

  • 相关阅读:
    phpcms V9 MVC模式 与 URL访问解析
    PHPCMS V9 框架代码分析(入口程序)
    批处理命令——for
    批处理命令——set
    批处理命令——if
    AndroidStudio简单的apk混淆
    CKEditor与CKFinder学习--CKFinder源代码改动自己定义上传文件名称
    LeetCode_Path Sum
    Java 并发:内置锁 Synchronized
    做游戏长知识------基于行为树与状态机的游戏AI(一)
  • 原文地址:https://www.cnblogs.com/xulan0922/p/14431072.html
Copyright © 2020-2023  润新知