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