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要强大一些。

posted @ 2021-02-22 16:35  酒红色  阅读(404)  评论(0编辑  收藏  举报