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 <tang@tang.com>"
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 <tang@tang.com>"
---> 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