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 进程 PID 为 1 ###
[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 的 PID 为 1,运行结束后,此容器会被删除,且并没有运行 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 进程 PID 为 1 ###
[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 不能自我嵌套,且不会触发 FROM 和 MAINTAINER 指令
## 使用包含 ONBUILD 指令的 Dockerfile 构建的镜像应该使用特殊的标签,例如 ruby:2.0-onbuil
## 在 ONBUILD 指令中使用 ADD 或 COPY 指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败
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 中任何 RUN 、 CMD 或 ENTRYPOINT 指令指定的程序时的用户名或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