Dockerfile体系结构之保留字指令

  • 保留字指令
  • 案例
    • Base镜像(scratch)
    • 自定义镜像mycentos案例
    • CMD/ENTRYPOINT镜像案例
      • CMD
      • ENTRYPOINT
    • ONBUILD案例
    • 自定义镜像Tomcat9案例
  • 总结

保留字指令

  • FROM:基础镜像,当前新镜像是基于哪个镜像的。
  • MAINTAINER:镜像维护者的姓名和邮箱地址。
  • RUN:容器构建时需要运行的命令。
  • EXPOSE:当前容器对外暴露出的端口。
  • VOLUME:容器数据卷,用于数据保存和持久化工作。
  • WORKDIR:指定工作目录。指定在创建容器后,终端默认登录进容器后的工作目录。
  • ENV:用来在构建镜像过程中设置环境变量。
  • ARG:构建参数,与ENV作用一致。不过作用域不一样。ARG设置的环境变量仅对Dockerfile内有效,只有docker build的过程中有效,构建好的镜像内不存在此环境变量。
  • ADD:ADD指令和COPY的使用类似(同样需求下,官方推荐使用COPY)将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和tar压缩包。
    • 区别:ADD的优点:在执行<源文件>为tar压缩文件的话,压缩格式为gzip,bzip2及xz的情况下,会自动复制并解压到<目标路径>。 ADD的缺点:在不解压的前提下,无法复制tar压缩文件,会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
  • COPY:复制命令,从上下文目录中复制文件或者目录到容器里的指定路径。
  • CMD:类似于run指令,用于指定一个容器启动时运行的命令,但二者运行的时间点不同:
    • CMD:在docker run 时运行。
      RUN:在docker build 。
      CMD会被docker run之后的参数替换。
      如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
  • ENTRYPOINT:类似于CMD指令,但其不会被docker run命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数追加给ENTRYPOINT指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
  • ONBUILD:用于延迟构建命令的执行。当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
  • USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
  • HEALTHCHECK:用于指定某个程序或着指令来监控docker容器服务的运行状态。
  • LABEL:LABEL指令用来给镜像添加一些元数据(metadata),以键值对的形式。
  • .dockerignore:忽略掉你不想追踪的文件。.dockerignore 文件的作用

Dockerfile参考文档

案例

Base镜像(scratch)

Docker hub中 99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

自定义镜像mycentos案例

自定义mycentos目的是我们自己的镜像具备如下:

  • 登录后的默认路径
  • vim编辑器
  • 查看网络配置ifconfig支持

1、编写
#Dockerfile文件
FROM centos
MAINTAINER yyds<123@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success------------>>ok"
CMD /bin/bash
2、构建
docker build -f Dockerfile文件名 -t 新镜像名字:TAG .

3、运行
docker images 新镜像名字:TAG
docker run -it 新镜像名字:TAG
4、列出镜像的变更历史
docker history 镜像ID

构建镜像

PS D:\opt\work> docker build -f .\Dockerfile -t mycentos:2.0 .
[+] Building 24.9s (8/8) FINISHED=> [internal] load build definition from Dockerfile                                                                                                                   0.0s=> => transferring dockerfile: 265B                                                                                                                                   0.0s=> [internal] load .dockerignore                                                                                                                                      0.0s=> => transferring context: 2B                                                                                                                                        0.0s=> [internal] load metadata for docker.io/library/centos:latest                                                                                                       0.0s=> CACHED [1/4] FROM docker.io/library/centos                                                                                                                         0.0s=> [2/4] WORKDIR /usr/local                                                                                                                                           0.0s=> [3/4] RUN yum -y install vim                                                                                                                                      20.9s=> [4/4] RUN yum -y install net-tools                                                                                                                                 3.2s=> exporting to image                                                                                                                                                 0.7s=> => exporting layers                                                                                                                                                0.7s=> => writing image sha256:58560ac56116cdcc750f20b40a2edef2b77ac5598c4e752b651a67a25a076b9b                                                                           0.0s=> => naming to docker.io/library/mycentos:2.0                                                                                                                        0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them-------------------查看构建的镜像----------------------------
PS D:\opt\work> docker images mycentos
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mycentos     2.0       58560ac56116   2 minutes ago   311MB---------------------------------查看镜像功能是否制作成功-------------------------------------------------------
PS D:\opt\work> docker run -it -d mycentos:2.0
155b6b5d5e34a3d5d37d11d9b942fb5ce2b9b9efe03c3419a92c49509c964af5
PS D:\opt\work> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
155b6b5d5e34   mycentos:2.0   "/bin/sh -c /bin/bash"   4 seconds ago   Up 3 seconds   80/tcp    compassionate_joliot
PS D:\opt\work> docker exec -it 155b6b5d5e34 bash
[root@155b6b5d5e34 local]# pwd
/usr/local
[root@155b6b5d5e34 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)RX packets 16  bytes 1312 (1.2 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@155b6b5d5e34 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@155b6b5d5e34 local]# touch 1.txt
[root@155b6b5d5e34 local]# echo 123 > 1.txt
[root@155b6b5d5e34 local]# vim 1.txt-------------------------列出镜像的变更历史------------------------------------------------------
PS D:\opt\work> docker images mycentos
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
mycentos     2.0       58560ac56116   3 days ago   311MB
PS D:\opt\work> docker history 58560ac56116
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
58560ac56116   3 days ago     CMD ["/bin/sh" "-c" "/bin/bash"]                0B        buildkit.dockerfile.v0
<missing>      3 days ago     CMD ["/bin/sh" "-c" "echo \"success---------…   0B        buildkit.dockerfile.v0
<missing>      3 days ago     CMD ["/bin/sh" "-c" "echo $MYPATH"]             0B        buildkit.dockerfile.v0
<missing>      3 days ago     EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      3 days ago     RUN /bin/sh -c yum -y install net-tools # bu…   14.8MB    buildkit.dockerfile.v0
<missing>      3 days ago     RUN /bin/sh -c yum -y install vim # buildkit    64.8MB    buildkit.dockerfile.v0
<missing>      3 days ago     WORKDIR /usr/local                              0B        buildkit.dockerfile.v0
<missing>      3 days ago     ENV MYPATH=/usr/local                           0B        buildkit.dockerfile.v0
<missing>      3 days ago     MAINTAINER yyds<tongh852@163.com>               0B        buildkit.dockerfile.v0
<missing>      3 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      3 months ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      3 months ago   /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0…   231MB

CMD/ENTRYPOINT镜像案例

相同点:都是指定一个容器启动时要运行的命令
不同点:CMD在多个CDM命令时,最后一条CMD会把之前其他的CMD命令覆盖执行最后一条。ENTRYPOINT在多条命令时,后边的命令参数会被追加执行。

CMD

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

case
Tomcat为例演示

首先拉取一个Tomcat镜像。
docker pull tomcat
执行启动命令并映射出端口
docker run -it -p 7777:8080 tomcat
后台会输出启动日志,Dockerfile里边最后会有一行
CMD ["catalina.sh","run"]
最后会执行以上CMD命令,启动并输出日志。


PS D:\opt\work> docker run -it tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
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.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
27-Dec-2021 08:15:02.977 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/10.0.13
27-Dec-2021 08:15:02.982 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Nov 9 2021 22:12:58 UTC
27-Dec-2021 08:15:02.982 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.0.13.0
27-Dec-2021 08:15:02.983 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
27-Dec-2021 08:15:02.984 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.10.16.3-microsoft-standard-WSL2
27-Dec-2021 08:15:02.984 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
27-Dec-2021 08:15:02.984 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
27-Dec-2021 08:15:02.984 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.13+8
27-Dec-2021 08:15:02.984 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
27-Dec-2021 08:15:02.985 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
27-Dec-2021 08:15:02.985 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
27-Dec-2021 08:15:03.009 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
27-Dec-2021 08:15:03.009 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
27-Dec-2021 08:15:03.010 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
27-Dec-2021 08:15:03.010 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
27-Dec-2021 08:15:03.010 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
27-Dec-2021 08:15:03.010 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
27-Dec-2021 08:15:03.010 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
27-Dec-2021 08:15:03.011 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
27-Dec-2021 08:15:03.026 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
27-Dec-2021 08:15:03.026 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
27-Dec-2021 08:15:03.037 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
27-Dec-2021 08:15:03.501 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
27-Dec-2021 08:15:03.555 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [869] milliseconds
27-Dec-2021 08:15:03.654 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
27-Dec-2021 08:15:03.654 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.13]
27-Dec-2021 08:15:03.673 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
27-Dec-2021 08:15:03.698 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [141] milliseconds
^C27-Dec-2021 08:15:09.779 INFO [Thread-2] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
27-Dec-2021 08:15:09.786 INFO [Thread-2] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
27-Dec-2021 08:15:09.790 INFO [Thread-2] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
27-Dec-2021 08:15:09.795 INFO [Thread-2] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]

如果在启动命令后边加上ls -l,就类似于在Dockerfile文件里边加了一行CMD命令,如下。但是Tomcat并未启动。
CMD ["catalina.sh","run"]
CMD ls -l

---------------------事例如下--------------------------------------------------
PS D:\opt\work> docker run -it -p 7777:8080 tomcat ls -l
total 160
-rw-r--r-- 1 root root 18994 Nov  9 22:12 BUILDING.txt
-rw-r--r-- 1 root root  6210 Nov  9 22:12 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Nov  9 22:12 LICENSE
-rw-r--r-- 1 root root  2333 Nov  9 22:12 NOTICE
-rw-r--r-- 1 root root  3372 Nov  9 22:12 README.md
-rw-r--r-- 1 root root  6905 Nov  9 22:12 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Nov  9 22:12 RUNNING.txt
drwxr-xr-x 2 root root  4096 Nov 15 20:58 bin
drwxr-xr-x 2 root root  4096 Nov  9 22:12 conf
drwxr-xr-x 2 root root  4096 Nov 15 20:58 lib
drwxrwxrwx 2 root root  4096 Nov  9 22:12 logs
drwxr-xr-x 2 root root  4096 Nov 15 20:58 native-jni-lib
drwxrwxrwx 2 root root  4096 Nov 15 20:58 temp
drwxr-xr-x 2 root root  4096 Nov 15 20:58 webapps
drwxr-xr-x 7 root root  4096 Nov  9 22:12 webapps.dist
drwxrwxrwx 2 root root  4096 Nov  9 22:12 work
PS D:\opt\work> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
155b6b5d5e34   mycentos:2.0   "/bin/sh -c /bin/bash"   49 minutes ago   Up 49 minutes   80/tcp    compassionate_joliot

ENTRYPOINT

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

case

制作CMD版可以查询ip信息的容器

  • curl命令解释
    curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作
    如果系统没有curl可以使用yum install curl安装,也可以下载安装
    curl是将下载文件输出到stdout
#Dockerfile2文件
#制作CMD版可以查询ip信息的容器
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
PS D:\opt\work> docker build -f Dockerfile3 -t myid .
[+] Building 16.4s (6/6) FINISHED=> [internal] load build definition from Dockerfile2                                                                                                                  0.0s=> => transferring dockerfile: 108B                                                                                                                                   0.0s=> [internal] load .dockerignore                                                                                                                                      0.0s=> => transferring context: 2B                                                                                                                                        0.0s=> [internal] load metadata for docker.io/library/centos:latest                                                                                                       0.0s=> CACHED [1/2] FROM docker.io/library/centos                                                                                                                         0.0s=> [2/2] RUN yum install -y curl                                                                                                                                     16.0s=> exporting to image                                                                                                                                                 0.3s=> => exporting layers                                                                                                                                                0.3s=> => writing image sha256:be33705a52a2a1cfdac47abcf20b0bd18578fe5d5b6dff6f78a928de3bdcf2f0                                                                           0.0s=> => naming to docker.io/library/myip                                                                                                                                0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
PS D:\opt\work> docker images myip
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
myip         latest    be33705a52a2   58 seconds ago   277MB
PS D:\opt\work> docker run -it myip
PS D:\opt\work> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS     NAMES
155b6b5d5e34   mycentos:2.0   "/bin/sh -c /bin/bash"   2 hours ago   Up 2 hours   80/tcp    compassionate_joliot
PS D:\opt\work> docker run -it be33705a52a2

例子:

  • 使用命令:curl http://www.baidu.com
    执行后,www.baidu.com的HTML就会显示在屏幕上了
PS D:\opt\work> curl www.baidu.comStatusCode        : 200
StatusDescription : OK
Content           : <!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always"...
RawContent        : HTTP/1.1 200 OKBdpagetype: 1Bdqid: 0xf1b4778700023447Connection: keep-aliveCache-Control: privateContent-Type: text/html;charset=utf-8Date: Mon, 27 Dec 2021 09:32:04 GMTExpires: Mon, 27 ...
Forms             : {form}
Headers           : {[Bdpagetype, 1], [Bdqid, 0xf1b4778700023447], [Connection, keep-alive], [Cache-Control, private]...}
Images            : {@{innerHTML=; innerText=; outerHTML=<img src="http://ss.bdimg.com/static/superman/img/topnav/newfanyi-da0cea8f7e.png">; outerText=; tagName=IMG; src=http://ss.bdimg.com/static/superman/img/topnav/newfanyi-da0cea8f7e.png}, @{innerHTML=; innerText=; outerHTML=<img src="http://ss.bdimg.com/static/superman/img/topnav/newxueshuicon-a5314d5c83.png">; outerText=; tagName=IMG; src=http://ss.bdimg.com/static/superman/img/topnav/newxueshuicon-a5314d5c83.png}, @{innerHTML=; innerText=; outerHTML=<img src="http://ss.bdimg.com/static/superman/img/topnav/newwenku-d8c9b7b0fb.png">; outerText=; tagName=IMG; src=http://ss.bdimg.com/static/superman/img/topnav/newwenku-d8c9b7b0fb.png}, @{innerHTML=; innerText=; outerHTML=<img src="http://ss.bdimg.com/static/superman/img/topnav/newbaike-889054f349.png">; outerText=; tagName=IMG; src=http://ss.bdimg.com/static/superman/img/topnav/newbaike-889054f349.png}...}
InputFields       : {@{innerHTML=; innerText=; outerHTML=<input name="ie" type="hidden" value="utf-8">; outerText=; tagName=INPUT; name=ie; type=hidden; value=utf-8}, @{innerHTML=; innerText=; outerHTML=<input name="f" type="hidden" value="8">; outerText=; tagName=INPUT; name=f; type=hidden; value=8}, @{innerHTML=; innerText=; outerHTML=<input name="rsv_bp" type="hidden" value="1">; outerText=; tagName=INPUT; name=rsv_bp; type=hidden; value=1}, @{innerHTML=; innerText=; outerHTML=<input name="rsv_idx" type="hidden" value="1">; outerText=; tagName=INPUT; name=rsv_idx; type=hidden; value=1}...}
Links             : {@{innerHTML=百度首页; innerText=百度首页; outerHTML=<a class="toindex" href="/">百度首页</a>; outerText=百度首页; tagName=A; class=toindex; href=/}, @{innerHTML=设置<i class="c-icon c-icon-triangle-down"></i>; innerText=设置; outerHTML=<a name="tj_settingicon" class="pf" href="javascript:;">设置<i class="c-icon c-icon-triangle-down"></i></a>; outerText=设置; tagName=A; name=tj_settingicon; class=pf; href=javascript:;}, @{innerHTML=登录; innerText=登录; outerHTML=<a name="tj_login" class="lb" onclick="return false;" href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;sms=5">登录</a>; outerText=登录; tagName=A; name=tj_login; class=lb; onclick=return false;; href=https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;sms=5}, @{innerHTML=新闻; innerText=新闻; outerHTML=<a class="mnav c-font-normal c-color-t" href="http://news.baidu.com" target="_blank">新闻</a>; outerText=新闻; tagName=A; class=mnav c-font-normal c-color-t; href=http://news.baidu.com; target=_blank}...}
ParsedHtml        : System.__ComObject
RawContentLength  : 329103

问题

  • 如果我们希望显示http头信息,就需要加上-i参数

why
制作ENTROYPOINT版查询ip信息的容器

#Dockerfile3文件
#制作ENTROYPOINT版可以查询ip信息的容器
FROM centos
RUN yum install -y curl
ENTROYPOINT ["curl","-s","http://ip.cn"]

构建镜像myip2
docker build -f .\Dockerfile3 -t myip2 .

ONBUILD案例

ONBUILD :子类继承父类的ONBUILD指令,在子类制作镜像时,继承父类镜像的时候触发执行。
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。

Dockerfile4文件

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father images onbuild---------886"

构建父类镜像myip_father
docker build -f .\Dockerfile4 -t myip_father .

Dockerfile5文件

FROM myip_father
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]

构建子类镜像
docker build -f .\Dockerfile5 -t myip_son .
此时FROM myip_father会触发父类的ONBUILD指令。

自定义镜像Tomcat9案例

1、mkdir -p /opt/work/tomcat9
2、在上述目录下touch c.txt
3、将jdk和Tomcat安装的压缩包拷贝进上一步目录

  • apache-tomcat-9.0.56.tar.gz
    jdk-8u201-linux-x64.tar.gz

4、在构建/opt/work/tomcat9目录下新建Dockerfile文件
5、构建

#Dockerfile6
FROM centos
MAINTAINER yyds<123@163.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local路径下
COPY c.txt /usr/local/cincontainer.txt
#把Java与Tomcat添加到容器中
ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.56.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与Tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/bin/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.56
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行Tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.56/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.56/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out

docker build -f .\Dockerfile6 -t yydstomcat9 .

PS D:\opt\work\tomcat9> docker build -f .\Dockerfile6 -t yydsTomcat9 .
invalid argument "yydsTomcat9" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
See 'docker build --help'.----------------docker镜像名字必须小写----------------------------------------PS D:\opt\work\tomcat9> docker build -f .\Dockerfile6 -t yydstomcat9 .
[+] Building 29.1s (11/11) FINISHED=> [internal] load build definition from Dockerfile6                                                                                                                  0.0s=> => transferring dockerfile: 1.10kB                                                                                                                                 0.0s=> [internal] load .dockerignore                                                                                                                                      0.0s=> => transferring context: 2B                                                                                                                                        0.0s=> [internal] load metadata for docker.io/library/centos:latest                                                                                                       0.0s=> CACHED [1/6] FROM docker.io/library/centos                                                                                                                         0.0s=> [internal] load build context                                                                                                                                      2.3s=> => transferring context: 203.45MB                                                                                                                                  2.3s=> [2/6] COPY c.txt /usr/local/cincontainer.txt                                                                                                                       0.1s=> [3/6] ADD jdk-8u201-linux-x64.tar.gz /usr/local/                                                                                                                   4.4s=> [4/6] ADD apache-tomcat-9.0.56.tar.gz /usr/local/                                                                                                                  0.4s=> [5/6] RUN yum -y install vim                                                                                                                                      19.5s=> [6/6] WORKDIR /usr/local                                                                                                                                           0.0s=> exporting to image                                                                                                                                                 2.2s=> => exporting layers                                                                                                                                                2.2s=> => writing image sha256:a19b70a141974dec7f1c695692e395fb18e277bf7ad0c91a221fa4b727a109d5                                                                           0.0s=> => naming to docker.io/library/yydstomcat9                                                                                                                         0.0sUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
-----------------查看构建好的镜像--------------------
PS D:\opt\work\tomcat9> docker images yydstomcat9
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
yydstomcat9   latest    a19b70a14197   2 minutes ago   709MB

6、run

  • docker启动命令:
    docker run -d -p 9080:8080 --name myt9 -v D:\opt\work\tomcat9\test:/usr/local/apache-tomcat-9.0.56/webapps/test -v D:\opt\work\tomcat9\tomcat9logs:/usr/local/apache-tomcat-9.0.56/logs --privileged=true yydstomcat9
  • –privileged=true:权限不够的话,写true
PS D:\opt\work\tomcat9> docker run -d -p 9080:8080 --name myt9 -v D:\opt\work\tomcat9\test:/usr/local/apache-tomcat-9.0.56/webapps/test -v D:\opt\work\tomcat9\tomcat9logs:/usr/local/apache-tomcat-9.0.56/logs --privileged=true yydstomcat9
1b2f9fab39041fd6f8e29780fb11e1411c0c074557653781f19470477f4d9d4d
PS D:\opt\work\tomcat9> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                    NAMES
1b2f9fab3904   yydstomcat9    "/bin/sh -c '/usr/lo…"   4 seconds ago   Up 3 seconds   0.0.0.0:9080->8080/tcp   myt9
PS D:\opt\work\tomcat9> docker exec -it myt9 bash
[root@1b2f9fab3904 local]#ls
apache-tomcat-9.0.56  bin  cincontainer.txt  etc  games  include  jdk1.8.0_201  lib  lib64  libexec  sbin  share  src
[root@1b2f9fab3904 local]# pwd
/usr/local
[root@1b2f9fab3904 local]# ls
apache-tomcat-9.0.56  bin  cincontainer.txt  etc  games  include  jdk1.8.0_201  lib  lib64  libexec  sbin  share  src
[root@1b2f9fab3904 local]# cd apache-tomcat-9.0.56/webapps/
[root@1b2f9fab3904 webapps]# ls
ROOT  docs  examples  host-manager  manager  test
[root@1b2f9fab3904 webapps]# cd test/
[root@1b2f9fab3904 test]# ls
[root@1b2f9fab3904 test]# touch 1.txt
[root@1b2f9fab3904 test]# cd ..
[root@1b2f9fab3904 webapps]# cd ..
[root@1b2f9fab3904 apache-tomcat-9.0.56]# cd logs/
[root@1b2f9fab3904 logs]# ls
catalina.2021-12-28.log  catalina.out  host-manager.2021-12-28.log  localhost.2021-12-28.log  localhost_access_log.2021-12-28.txt  manager.2021-12-28.log
[root@1b2f9fab3904 logs]#java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@1b2f9fab3904 logs]# pwd
/usr/local/apache-tomcat-9.0.56/logs
[root@1b2f9fab3904 logs]# cd ../webapps/test/
[root@1b2f9fab3904 test]# ls
1.txt
[root@1b2f9fab3904 test]# pwd
/usr/local/apache-tomcat-9.0.56/webapps/test

7、验证

http://localhost:9080/

8、结合前述的容器卷测试的web服务test发布



总结

Dockerfile体系结构之保留字指令相关推荐

  1. Dockerfile中的保留字指令讲解

    之前简单学过Docker,当时是为了快速部署一个项目,过的很快,对于Dockerfile文件的编写,有些显的陌生. 所以就写了这篇文章.希望能够帮助到大家哦!!! 一.Dockerfile是什么? 概 ...

  2. dockerfile详解-dockerfile构建过程解析,dockerfile体系结构保留字解析,案例解析

    Dockerfile详解 1.定义:Dockerfile是用来构建Docker镜像的构建文件,是一系列命令和参数构成的脚本 2.步骤: --手动编写一个dockerfile文件,必须要要符合规范 -- ...

  3. Dockerfile文件中CMD指令与ENTRYPOINT指令的区别

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  4. dockerfile中的env指令_Dockerfile中的ENV指令详解

    1. Dockerfile中的ENV指令用以定义镜像的环境变量.示例如下: RUN set -ex && apt-get update && apt-get insta ...

  5. 飞腾CPU体系结构之低功耗指令

    飞腾CPU体系结构之低功耗指令 WFE和WFI指令 当飞腾CPU核执行两类指令:WFE或WFI之后,CPU核会进入低功耗状态: 一旦CPU核进入低功耗状态,就要一直保持低功耗状态直到相应的唤醒事件发生 ...

  6. 飞腾CPU体系结构之系统指令

    访问系统寄存器编码空间的指令,提供以下功能: 访问系统寄存器,包括调试寄存器,系统状态和控制相关的寄存器. 访问专用寄存器,例如程序状态保存寄存器SPSR.异常链接寄存器ELR,以及CPU状态的某些域 ...

  7. (十二) 简单使用 Dockerfile 保留字指令,尝试自定义centos镜像

         需求 自己使用Dockerfile构建一个自己自定义的centos 镜像.自定义的centos镜像中中可以使用 vim 命令 (精简版的centos镜像中是没有vim的). 一.查看dock ...

  8. dockerfile中的env指令_11.dockerfile之ENV指令

    一.ENV指令说明 ENV指令用来在镜像构建过程中设置环境变量,后续的RUN可以使用它所创建的环境变量 当创建基于该镜像的container的时候,会自动拥有设置的环境变量 二.ENV案例 首先,编写 ...

  9. 01 ARM体系结构与汇编指令

    注:本文章是由笔者学习朱有鹏arm的学习笔记,特此感谢朱老师. 关于汇编: 1.汇编的实质是机器指令(机器码)的 助记符,是一款CPU的本质特征. 2.不同CPU的机器指令集设计不同,因此 汇编程序不 ...

最新文章

  1. 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数
  2. Fuzz学习笔记(一)—— WinAFL环境搭建与基本使用
  3. Python陷阱:为什么不能用可变对象作为函数的默认参数值
  4. 2021牛客暑期多校训练营1 G Game of Swapping Numbers 思维 + 巧妙的转换
  5. Mybatis—代理开发和核心配置文件深入
  6. leetcode讲解--513. Find Bottom Left Tree Value
  7. MYSQL存储过程中事务和DECLARE EXIT/CONTINUE HANDLER的使用
  8. dpkg: error: dpkg status database is locked by another process 解决方法
  9. python语言的主网址-Python简介
  10. Java实现PDF生成(Word文档转Pdf)
  11. 前端性能优化原理与实践
  12. 使用R包barplot3d绘制3D条形图-2020-07-04Sat
  13. 六、HTML高级标签
  14. Rayson API 框架分析系列之1: 简介
  15. 数字化名词解释—数字化转型
  16. Java评论点赞推送系统_推送(评论,点赞,关注)
  17. 解决更新包与已安装应用的签名不一致的问题
  18. T507修改分区方法-Linux、Android系统适用
  19. FPGA SATA IP控制器的SATA接口调试记录
  20. 立创EDA仿真入门1 基本操作

热门文章

  1. 顺丰、菜鸟“较劲”末端物流
  2. 指纹识别综述(10): 深度学习方法
  3. pat1121 Damn Single
  4. GV2、GV3、GV4热磁和单磁断路器区别是什么?
  5. autoware lidar_localizer包下的ndt_matching节点的学习
  6. [原创]我个人整理的AD/2000技巧,各位收藏吧!60多个。
  7. R语言ggplot2可视化:使用patchwork包的plot_layout函数将多个可视化图像组合起来,ncol参数指定行的个数、byrow参数指定按照行顺序排布图
  8. hexo博客yilia主题添加复制代码块功能
  9. 饕餮盛宴——滑动窗口(尺取法)
  10. 5、TWS API的故障排除和支持