Docker Image Build 和 Dockerfile 进行 Docker Image 制作详解(制作 Docker Image 方法之二)、Dockerfile 指令详解 第二篇

1、第一篇链接

Docker Image Build 和 Dockerfile 进行 Docker Image 制作详解(制作 Docker Image 方法之二)、Dockerfile 指令详解 第一篇

2、RUN 指令

在这里插入图片描述

2.1 介绍

  • 用于指定 docker container build 过程中运行的程序,其可以是任何命令

2.2 语法

# RUN <command> 
# RUN ["<executable>", "<param1>", "<param2>"]
## 第一种格式中,<command> 通常是一个 shell 命令, 且以“ /bin/sh -c ”来运行它
   这意味着此进程在容器中的 PID 不为 1,不能接收 Unix 信号
   因此,当使用 docker stop <container> 命令停止容器时
   此进程接收不到 SIGTERM 信号
   
## 第二种语法格式中的参数是一个 JSON 格式的数组
   其中 <executable> 为要运行的命令
   后面的 <paramN> 为传递给命令的选项或参数
   然而,此种格式指定的命令不会以 “/bin/sh -c” 来发起
   因此常见的 shell 操作如变量替换以及通配符 (?,*) 替换将不会进行
   不过,如果要运行的命令依赖于此 shell 特性的话,可以将其替换为类似下面的格式
   RUN ["/bin/bash", "-c", "<executable>", "<param1>"]

2.3 示例

### 文件准备 ###
[root@Tang imagebuildbusybox]# tree ../imagebuildbusybox/
../imagebuildbusybox/
├── Dockerfile
├── nginx-1.17.6.tar.gz
├── scptext
│   ├── index.html
│   ├── test1.html
│   ├── test2.html
│   └── test3.html
└── volume

2 directories, 6 files
[root@Tang imagebuildbusybox]# cat scptext/index.html 
<h1>Welcome To Tang Web Server</h1>

### Dockerfile 文件查看,进行复制文件,并执行 RUN 命令 ###
[root@Tang imagebuildbusybox]# cat Dockerfile
FROM busybox:latest

LABEL maintainer="Tang <[email protected]>"

ENV DOC_ROOT=/data/web/html/ NGINX_TAR=nginx-1.17.6.tar.gz

COPY scptext/ ${DOC_ROOT}

WORKDIR ${DOC_ROOT}

ADD ${NGINX_TAR} ./

EXPOSE 80/tcp

RUN mkdir ${DOC_ROOT}/runcommandtest/ \      # \ 是行连接符
	touch ${DOC_ROOT}/runcommandtest/runcommandtest.txt 
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusybox]# docker image build /root/imagebuildbusybox/ -t mybbx:v1
Sending build context to Docker daemon  1.046MB
Step 1/8 : FROM busybox:latest
 ---> 020584afccce
Step 2/8 : LABEL maintainer="Tang <[email protected]>"
 ---> Using cache
 ---> 759a81a473eb
Step 3/8 : ENV DOC_ROOT=/data/web/html/ NGINX_TAR=nginx-1.17.6.tar.gz
 ---> Using cache
 ---> 25567cda2641
Step 4/8 : COPY scptext/ ${DOC_ROOT}
 ---> Using cache
 ---> 014a0768fa75
Step 5/8 : WORKDIR ${DOC_ROOT}
 ---> Using cache
 ---> b9aa84c47379
Step 6/8 : ADD ${NGINX_TAR} ./
 ---> Using cache
 ---> 0c72d71d729c
Step 7/8 : EXPOSE 80/tcp
 ---> Using cache
 ---> d96ab4753618
Step 8/8 : RUN mkdir ${DOC_ROOT}/runcommandtest/ 	touch ${DOC_ROOT}/runcommandtest/runcommandtest.txt
 ---> Running in e77203d88f40
Removing intermediate container e77203d88f40
 ---> 3be6a547b64a
Successfully built 3be6a547b64a
Successfully tagged mybbx:v1
[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mybbx               v1                  3be6a547b64a        9 seconds ago       7.46MB
nginx               latest              231d40e811cd        6 days ago          126MB
centos              7                   5e35e350aded        2 weeks ago         203MB
busybox             latest              020584afccce        4 weeks ago         1.22MB
### 运行新的容器,并查看目录和创建的文件 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -it mybbx:v1
/data/web/html # ls
index.html      nginx-1.17.6    runcommandtest  test1.html      test2.html      test3.html      touch
/data/web/html # ll runcommandtest/
sh: ll: not found
/data/web/html # ls runcommandtest/
runcommandtest.txt
/data/web/html # exit

3、CMD 指令

在这里插入图片描述

3.1 介绍

  • 类似于 RUN 指令,CMD 指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
  • RUN 指令运行于映像文件构建过程中,而 CMD 指令运行于基于 Dockerfile 构建出的新映像文件启动一个容器时
  • CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过, CMD 指定的命令其可以被 docker container run 的命令行选项所覆盖,在 Dockerfile 中可以存在多个CMD指令,但仅最后一个会生效

3.2 语法

# CMD <command>  
# CMD [<executable>",“<param1>","<param2>"]  
# CMD ["<param1>","<param2>"]

	## 前两种语法格式的意义同 RUN
	## 第三种则用于为 ENTRYPOINT 指令提供默认参数
	## json数组中,要使用双引号,单引号会出错

3.3 示例

### Dockerfile 文件查看,执行 CMD 命令 ###
[root@Tang imagebuildbusybox]# pwd
/root/imagebuildbusybox
[root@Tang imagebuildbusybox]# cat Dockerfile 
FROM busybox:latest

LABEL maintainer="Tang <[email protected]>"

ENV WEB_DOC_ROOT="/data/web/html"
 
RUN mkdir -p ${WEB_DOC_ROOT} && \
	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
	  
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusybox]# docker image build /root/imagebuildbusybox/ -t mgbbx:v2
Sending build context to Docker daemon  1.046MB
Step 1/5 : FROM busybox:latest
 ---> 020584afccce
Step 2/5 : LABEL maintainer="Tang <[email protected]>"
 ---> Using cache
 ---> 759a81a473eb
Step 3/5 : ENV WEB_DOC_ROOT="/data/web/html"
 ---> Running in 8cd9b4b1b222
Removing intermediate container 8cd9b4b1b222
 ---> 369991e06078
Step 4/5 : RUN mkdir -p ${WEB_DOC_ROOT} && 	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
 ---> Running in 57d1f08dade4
Removing intermediate container 57d1f08dade4
 ---> 93bf53f0e6a7
Step 5/5 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
 ---> Running in 0b761b7b26c8
Removing intermediate container 0b761b7b26c8
 ---> 90b2e8df3729
Successfully built 90b2e8df3729
Successfully tagged mgbbx:v2

[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mgbbx               v2                  90b2e8df3729        8 minutes ago       1.22MB
mybbx               v1                  3be6a547b64a        2 days ago          7.46MB
nginx               latest              231d40e811cd        9 days ago          126MB
centos              7                   5e35e350aded        2 weeks ago         203MB
busybox             latest              020584afccce        4 weeks ago         1.22MB
### 运行新的容器,并对其进行访问 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -d mgbbx:v2
e3c87871aa6d24d7f92145d2581cfc0258b3c66a8343a5a0c63ed7e7499b7da5

### 查看容器内部的进程,可以看出 HTTPD 进程 PID1 ###
[root@Tang imagebuildbusybox]# docker container exec tangimgtest ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/httpd -f -h /data/web/html
    7 root      0:00 ps

### 查看容器内部的环境变量 ###
[root@Tang imagebuildbusybox]# docker container exec tangimgtest printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e3c87871aa6d
WEB_DOC_ROOT=/data/web/html
HOME=/root

### 查看容器的 IP 地址,并进行访问 ###
[root@Tang imagebuildbusybox]# docker inspect -f {{.NetworkSettings.IPAddress}} tangimgtest
172.17.0.2
[root@Tang imagebuildbusybox]# curl http://172.17.0.2
<h1>Tang's Busybox Httpd Test Server</h1>
### CMD 指定的命令其可以被 docker container run 的命令行选项所覆盖 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest2 --rm mgbbx:v2 ps
PID   USER     TIME  COMMAND
    1 root      0:00 ps

### 运行完毕后,此 ps 的 PID1,运行结束后,此容器会被删除,且并没有运行 HTTPD 程序 ###
[root@Tang imagebuildbusybox]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
e3c87871aa6d        mgbbx:v2            "/bin/sh -c '/bin/ht…"   13 minutes ago      Up 13 minutes                               tangimgtest

4、ENTRYPOINT 指令

在这里插入图片描述

4.1 介绍

  • 类似 CMD 指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
  • 与 CMD 不同的是,由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定指定的程序
  • 不过,docker run 命令的 --entrypoint 选项的参数可覆盖 ENTRYPOINT 指令指定的程序

4.2 语法

# ENTRYPOINT <command>
# ENTRYPOINT ["<executable>", "<param1>", "<param2>"]

	## docker run 命令传入的命令参数会覆盖 CMD 指令的内容并且附加到 ENTRYPOINT 命令最后做为其参数使用
	## Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效

4.3 示例

### Dockerfile 文件查看,执行 ENTRYPOINT 命令 ###
[root@Tang imagebuildbusybox]# pwd
/root/imagebuildbusybox
[root@Tang imagebuildbusybox]# cat Dockerfile 
FROM busybox:latest

LABEL maintainer="Tang <[email protected]>"

ENV WEB_DOC_ROOT="/data/web/html"
 
RUN mkdir -p ${WEB_DOC_ROOT} && \
	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
	  
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusybox]# docker image build /root/imagebuildbusybox/ -t mybbx:v3
Sending build context to Docker daemon  1.046MB
Step 1/5 : FROM busybox:latest
 ---> 020584afccce
Step 2/5 : LABEL maintainer="Tang <[email protected]>"
 ---> Using cache
 ---> 759a81a473eb
Step 3/5 : ENV WEB_DOC_ROOT="/data/web/html"
 ---> Using cache
 ---> 369991e06078
Step 4/5 : RUN mkdir -p ${WEB_DOC_ROOT} && 	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
 ---> Using cache
 ---> 93bf53f0e6a7
Step 5/5 : ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
 ---> Running in 7e8ec1c191ab
Removing intermediate container 7e8ec1c191ab
 ---> 292eb00f8fe3
Successfully built 292eb00f8fe3
Successfully tagged mybbx:v3

[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mybbx               v3                  292eb00f8fe3        5 seconds ago       1.22MB
mgbbx               v2                  90b2e8df3729        28 minutes ago      1.22MB
mybbx               v1                  3be6a547b64a        2 days ago          7.46MB
nginx               latest              231d40e811cd        9 days ago          126MB
centos              7                   5e35e350aded        2 weeks ago         203MB
busybox             latest              020584afccce        4 weeks ago         1.22MB
### 运行新的容器,并对其进行访问 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -d mybbx:v3
2ec0b36ec13c6e2578b770a397aaf33b45ab3f41cc3bd1d068beef4b24490228

### 查看容器内部的进程,可以看出 HTTPD 进程 PID1 ###
[root@Tang imagebuildbusybox]# docker container exec tangimgtest ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/httpd -f -h /data/web/html
    7 root      0:00 ps

### 查看容器内部的环境变量 ###
[root@Tang imagebuildbusybox]# docker container exec tangimgtest printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e3c87871aa6d
WEB_DOC_ROOT=/data/web/html
HOME=/root

### 查看容器的 IP 地址,并进行访问 ###
[root@Tang imagebuildbusybox]# docker inspect -f {{.NetworkSettings.IPAddress}} tangimgtest
172.17.0.2
[root@Tang imagebuildbusybox]# curl http://172.17.0.2
<h1>Tang's Busybox Httpd Test Server</h1>
### ENTRYPOINT 指定的命令不会被 docker container run 的命令行选项所覆盖 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest2 --rm mybbx:v3 ps

### 此 ps 命令不会被执行,但是容器已经在后台运行 ###
[root@Tang ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
16b7505bfe13        mybbx:v3            "/bin/sh -c '/bin/ht…"   49 seconds ago      Up 46 seconds                           tangimgtest2
2ec0b36ec13c        mybbx:v3            "/bin/sh -c '/bin/ht…"   2 minutes ago       Up 2 minutes                            tangimgtest

### 可通过 exec 来查看容器进程 ###
[root@Tang ~]# docker container exec tangimgtest2 ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/httpd -f -h /data/web/html
    6 root      0:00 ps

5、RUN CMD ENTRYPOINT 三个指令区别

在这里插入图片描述

6、HEALTHCHECK 指令

6.1 介绍

  • HEALTHCHECK 指令告诉 Docker 如何测试容器以检查它是否仍在工作
  • 即使服务器进程仍在运行,这也可以检测出陷入无限循环且无法处理新连接的 Web 服务器等情况

6.2 语法

# HEALTHCHECK [OPTIONS] CMD command (通过在容器内运行命令来检查容器运行状况)
# HEALTHCHECK NONE (禁用从基础映像继承的任何运行状况检查)
OPTIONS 选项:

	## --interval=DURATION (default: 30s)        # 每隔多长时间探测一次,默认30秒
	## --timeout= DURATION (default: 30s)        # 服务响应超时时长,默认30秒
	## --start-period= DURATION (default: 0s)    # 服务启动多久后开始探测,默认0秒
	## --retries=N (default: 3)                  # 认为检测失败几次为宕机,默认3
返回值:

	## 0	# 容器成功是健康的,随时可以使用
	## 1 	# 不健康的容器无法正常工作
	## 2	# 保留不使用此退出代码

6.3 示例

### Dockerfile 文件查看,执行健康状态检查命令 ###
[root@Tang imagebuildbusybox]# pwd
/root/imagebuildbusybox
[root@Tang imagebuildbusybox]# cat Dockerfile 
FROM busybox:latest

LABEL maintainer="Tang <[email protected]>"

ENV WEB_DOC_ROOT="/data/web/html"
 
RUN mkdir -p ${WEB_DOC_ROOT} && \
	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
	  
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
 
HEALTHCHECK --start-period=3s --timeout=5s  --interval=5s --retries=5 CMD wget -O - -q http://${IP:-0.0.0.0}:10080/

### 检测容器的健康状态:访问 10080 端口,服务器开启后 3s 进行检测 ###
### 每隔 5s 检测一次,超时时间为 5s ,重试次数为 5 次 ###
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusybox]# docker image build /root/imagebuildbusybox/ -t mybbx:v5
Sending build context to Docker daemon  1.046MB
Step 1/6 : FROM busybox:latest
 ---> 020584afccce
Step 2/6 : LABEL maintainer="Tang <[email protected]>"
 ---> Using cache
 ---> 759a81a473eb
Step 3/6 : ENV WEB_DOC_ROOT="/data/web/html"
 ---> Using cache
 ---> 369991e06078
Step 4/6 : RUN mkdir -p ${WEB_DOC_ROOT} && 	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
 ---> Using cache
 ---> 93bf53f0e6a7
Step 5/6 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
 ---> Using cache
 ---> 90b2e8df3729
Step 6/6 : HEALTHCHECK --start-period=3s --timeout=5s  --interval=5s --retries=5 CMD wget -O - -q http://${IP:-0.0.0.0}:10080/
 ---> Running in 6c961adcc57c
Removing intermediate container 6c961adcc57c
 ---> 5620989301c6
Successfully built 5620989301c6
Successfully tagged mybbx:v5

[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mybbx               v5                  5620989301c6        8 seconds ago       1.22MB
mybbx               v3                  292eb00f8fe3        23 minutes ago      1.22MB
mgbbx               v2                  90b2e8df3729        51 minutes ago      1.22MB
mybbx               v1                  3be6a547b64a        2 days ago          7.46MB
nginx               latest              231d40e811cd        9 days ago          126MB
centos              7                   5e35e350aded        2 weeks ago         203MB
busybox             latest              020584afccce        4 weeks ago         1.22MB
### 运行新的容器 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -d mybbx:v5
01ac47deb06284e93f4da4d49a36735387e77e3e96f61a32d1eb0bcd9d93234a

### 刚创建时,因超时次数未到,所以状态是 healthy ###
[root@Tang ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                     PORTS               NAMES
01ac47deb062        mybbx:v5            "/bin/sh -c '/bin/ht…"   3 seconds ago       Up Less than a second (health: starting)                       tangimgtest
[root@Tang ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                             PORTS               NAMES
01ac47deb062        mybbx:v5            "/bin/sh -c '/bin/ht…"   29 seconds ago      Up 26 seconds (health: starting)                       tangimgtest

### 超时次数超过 5 次时,会被判断为 unhealthy ,因为 HTTPD 服务是 80 端口,不是 10080 端口 ###
[root@Tang ~]# docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
01ac47deb062        mybbx:v5            "/bin/sh -c '/bin/ht…"   59 seconds ago      Up 57 seconds (unhealthy)                       tangimgtest

7、ONBUILD 指令

在这里插入图片描述

7.1 介绍

  • 用于在 Dockerfile 中定义一个触发器
  • Dockerfile 用于 build 映像文件,此映像文件亦可作为 base image 被另一个 Dockerfile 用作 FROM 指令的参数,并以之构建新的映像文件
  • 在后面的这个 Dockerfile 中的 FROM 指令在 build 过程中被执行时,将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触发器

7.2 语法

#ONBUILD < Instruction>

	## 尽管任何指令都可注册成为触发器指令,但 ONBUILD 不能自我嵌套,且不会触发 FROMMAINTAINER 指令
 	## 使用包含 ONBUILD 指令的 Dockerfile 构建的镜像应该使用特殊的标签,例如 ruby:2.0-onbuil
 	## 在 ONBUILD 指令中使用 ADDCOPY 指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

7.3 示例

7.3.1 创建第一个镜像

### Dockerfile 文件查看 ###
[root@Tang imagebuildbusybox]# pwd
/root/imagebuildbusybox
[root@Tang imagebuildbusybox]# cat Dockerfile 
FROM busybox:latest

LABEL maintainer="Tang <[email protected]>"

ENV WEB_DOC_ROOT="/data/web/html"
 
RUN mkdir -p ${WEB_DOC_ROOT} && \
	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
	  
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

ONBUILD RUN echo "<h1>Tang's Busybox Httpd ONBUILD-TEST Server</h1>" >> /data/web/html/index.html
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusybox]# docker image build /root/imagebuildbusybox/ -t mybbx:v6
Sending build context to Docker daemon  1.046MB
Step 1/6 : FROM busybox:latest
 ---> 020584afccce
Step 2/6 : LABEL maintainer="Tang <[email protected]>"
 ---> Using cache
 ---> 759a81a473eb
Step 3/6 : ENV WEB_DOC_ROOT="/data/web/html"
 ---> Using cache
 ---> 369991e06078
Step 4/6 : RUN mkdir -p ${WEB_DOC_ROOT} && 	echo "<h1>Tang's Busybox Httpd Test Server</h1>" > ${WEB_DOC_ROOT}/index.html
 ---> Using cache
 ---> 93bf53f0e6a7
Step 5/6 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
 ---> Using cache
 ---> 90b2e8df3729
Step 6/6 : ONBUILD RUN echo "<h1>Tang's Busybox Httpd ONBUILD-TEST Server</h1>" >> /data/web/html/index.html
 ---> Running in a4f8f3c90c02
Removing intermediate container a4f8f3c90c02
 ---> a27de9dc92bf
Successfully built a27de9dc92bf
Successfully tagged mybbx:v6

[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mybbx               v7                  4166a5d45980        About a minute ago   1.22MB
mybbx               v6                  a27de9dc92bf        2 minutes ago        1.22MB
mybbx               v5                  5620989301c6        22 minutes ago       1.22MB
mybbx               v3                  292eb00f8fe3        46 minutes ago       1.22MB
mgbbx               v2                  90b2e8df3729        About an hour ago    1.22MB
mybbx               v1                  3be6a547b64a        2 days ago           7.46MB
nginx               latest              231d40e811cd        9 days ago           126MB
centos              7                   5e35e350aded        2 weeks ago          203MB
busybox             latest              020584afccce        4 weeks ago          1.22MB
### 运行新的容器 ###
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -d mybbx:v5
01ac47deb06284e93f4da4d49a36735387e77e3e96f61a32d1eb0bcd9d93234a
[root@Tang imagebuildbusybox]# docker container run --name tangimgtest --rm -d mybbx:v6
e6b9c780dbd36725c77bbbb0785c1645b75c81f27feb666226ba0c08c2d90682

### 查看容器 IP ###
[root@Tang imagebuildbusybox]# docker inspect -f {{.NetworkSettings.IPAddress}} tangimgtest
172.17.0.2

### 进行访问 ###
[root@Tang imagebuildbusybox]# curl http://172.17.0.2
<h1>Tang's Busybox Httpd Test Server</h1>

7.3.2 基于第一个镜像,创建第二个镜像

### Dockerfile 文件查看 ###
[root@Tang imagebuildbusyboxtest]# pwd
/root/imagebuildbusyboxtest

[root@Tang imagebuildbusyboxtest]# cat Dockerfile 
FROM mybbx:v6
### 运用 docker image build 生成镜像,使用 -t 打 TAG ###
[root@Tang imagebuildbusyboxtest]# docker image build /root/imagebuildbusyboxtest/ -t mybbx:v7
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM mybbx:v6
# Executing 1 build trigger
 ---> Running in 96452621bcc3
Removing intermediate container 96452621bcc3
 ---> 4166a5d45980
Successfully built 4166a5d45980
Successfully tagged mybbx:v7

[root@Tang imagebuildbusybox]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mybbx               v7                  4166a5d45980        About a minute ago   1.22MB
mybbx               v6                  a27de9dc92bf        2 minutes ago        1.22MB
mybbx               v5                  5620989301c6        22 minutes ago       1.22MB
mybbx               v3                  292eb00f8fe3        46 minutes ago       1.22MB
mgbbx               v2                  90b2e8df3729        About an hour ago    1.22MB
mybbx               v1                  3be6a547b64a        2 days ago           7.46MB
nginx               latest              231d40e811cd        9 days ago           126MB
centos              7                   5e35e350aded        2 weeks ago          203MB
busybox             latest              020584afccce        4 weeks ago          1.22MB
### 运行新的容器 ###
[root@Tang imagebuildbusyboxtest]# docker container run --name tangimgtest2 --rm -d mybbx:v7
b0789384b8bf74c4e72f580cb9717c51b90d44df9f851db9b771de272fce15ec

### 查看容器 IP ###
[root@Tang imagebuildbusyboxtest]# docker inspect -f {{.NetworkSettings.IPAddress}} tangimgtest2
172.17.0.3

### 进行访问,可以证明 ONBUILD 指令,只在第2个 Dockerfile 文件中生效###
[root@Tang imagebuildbusyboxtest]# curl http://172.17.0.3
<h1>Tang's Busybox Httpd Test Server</h1>
<h1>Tang's Busybox Httpd ONBUILD-TEST Server</h1>

8、其它指令

8.1 USER

# 介绍:
	## 用于指定运行 image 时的或运行 Dockerfile 中任何 RUNCMDENTRYPOINT 指令指定的程序时的用户名或UID
	## 默认情况下,docker container 的运行身份为 root 用户


# 语法
	## USER <UID>| <U USERNAME >
		## 需要注意的是,<UID> 可以为任意数字,但实践中其必须为 /etc/passwd 中某用户的有效 UID
		## 否则,docker container run 命令将运行失败

8.2 ARG

# 介绍	
	## ARG 指令类似 ENV,定义了一个变量
	## 区别于 ENV:用户可以在构建时 docker container build --build-arg <varname> = <value> 进行对变量的修改,ENV 不可以
 	## 如果用户指定了未在 Dockerfile 中定义的构建参数,那么构建输出警告


# 语法
	## ARG <name>[= <default value>]
		## Dockerfile可以包含一个或多个ARG指令

8.3 SHELL

# 介绍
	## SHELL 指令允许覆盖用于 shell 命令形式的默认 shell
	## Linux 上的默认shell是[/ bin / sh”,“c”],在Windows上是[“cmd”,“/ S”,“/ C]
 	## SHELL 指令必须以 JSON 格式写入 Dockerfile

# 语法 
	## SHELL ["executable", "parameters"]
		## SHELL 指令可以多次出现
		## 每个 SHELL 指令都会覆盖所有先前的 SHELL 指令,并影响所有后续指令

8.4 STOPSIGNAL

# 介绍
	## STOPSIGNAL 指令设置将发送到容器出口的系统调用信号
	## 此信号可以是与内核的系统调用表中的位置匹配的有效无符号数
	## 例如9,或者 SIGNAME 格式的信号名,例如 SIGKILL

# 语法
	## STOPSIGNAL signal
发布了158 篇原创文章 · 获赞 7 · 访问量 9734

猜你喜欢

转载自blog.csdn.net/weixin_44983653/article/details/103311124