1. RUN
- 用于指定 docker build 过程中运行的程序,其可以是任何命令
- Syntax
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. CMD 指令
- Syntax
CMD <command>
CMD ["<executable", "<param1>", "<param2>"]
CMD ["<param1>", "<param2>"]
- 前两种语法格式的意义同 RUN
- 第三种语法则用于
ENTRYPOINT
指令提供默认参数
3. ENTRYPOINT
- 类似
CMD
指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序 - 与
CMD
不同的是,由ENTRYPOINT
启动的程序不会被docker run
命令行指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT
指定的程序- 不过,
docker run
命令的--entrypoint
选项的参数可覆盖ENTRYPOINT
指令指定的程序
- 不过,
- Syntax
ENTRYPOINT <command>
ENTRYPOINT ["<executable>", "<param1>", "<param2>"]
-
docker run
命令传入的命令参数会覆盖CMD
指令的内容并且附加到ENTRYPOINT
命令最后作为其参数使用 -
Dockerfile
文件中也可以存在多个ENTRYPOINT
指令,但仅有最后一个会生效
4. USER
- 用于指定运行
image
时的或运行 Dockerfile 中任何RUN
、CMD
或ENTRYPOINT
指令指定的程序时的用户名或UID
- 默认情况下,
container
的运行身份为root
用户 - Syntax
USER <UID> | <UserName>
- 需要注意的是,
<UID>
可以为任意数字,但实践中其必须为/etc/passwd
中某用户的有效UID
,否则,docker run
命令将运行失败
4. HEALTHCHECK
-
Syntax
-
HEALTHCHECK [OPTIONS] CMD command
,通过在容器中运行 command 命令检测容器健康状态 -
HEALTHCHECK NONE
禁用健康检查
-
-
options
-
--interval=DURATION
(defatult: 30s) 检测时间间隔 -
--timeout=DURATION
(defatult: 30s) -
--start-period=DURATION
(defatult: 0s) 开始等待时间,比如,主进程启动需要10秒钟,那么需要修改这个值,大于10s,避免程序启动就开始检测,而这时程序还不可用 -
--retryies=N
(defatult: 3s),重试次数
-
-
command 的 exit status 表明容器的健康状态
-
0
: success -
1
: unhealthy -
2
: reserved - do not use this exit code (可以自己定义)
-
-
例子(\ 表示换行)
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
wget -O - -q www.bauidu.com
:这个命令可以把html打印到shell上
5. SHELL
如果不是 json 数组格式的指令,默认的 shell 在 Linux 是 ["/bin/sh", "-c"]
,在 Windows 是 ["cmd", "/S", "/C"]
,这里的指令用于运行程序默认要运行的 SHELL
- shell 指令在 Dockerfile 中必须使用 JSON 格式进行重写
- shell 指令可以出现多次,每个 shell 指令覆盖之前的 shell 指令,并且影响后续的指令
6. STOPSIGNAL
进程号id 为 1 的,可以接收 docker stop 命令,从而能够停止主进程,从而停止容器。如 stop 发送的是 15,signal 是无符号整型数字(必须匹配 kernal 的 syscall table),如 9
,也可以是 SIGNAME,如 SIGKILL
- Syntax
- STOPSIGNAL signal
7. ARG
使用 ARG 指令可以在 docker build
过程中传值,使用 --build-arg <varname>=<value>
,如果用户指定的构建参数在 Dockerfile 中未定义,构建会输出警告信息
- Syntax
ARG <name>[=<default value>]
一个 Dockerfile 中可能包含多个 ARG 指令,一个 ARG 可能包含一个默认值。比如:
ARG version=1.14
ARG user=mageedu
8. ONBUILD
- 用于在
Dockerfile
中定义一个触发器 -
Dockerfile
用于build
镜像文件,此镜像文件可以作为base image
被另一个Dockerfile
用做FROM
指令的参数,并以只构建新的镜像文件 - 在后面的这个
Dockerfile
中的FROM
指令在build
过程中被执行时,将会“触发”创建其base image
的Dockerfile
文件中ONBUILD
指令定义的触发器 - Syntax
ONBUILD <INSTRUCTION>
- 尽管任何指令都可以注册成为触发器指令,但
ONBUILD
不能自我嵌套,且不会触发FROM
和MAINTAINER
指令 - 使用包含
ONBUILD
指令的Dockerfile
构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild
- 在
ONBUILD
指令中使用ADD
或COPY
指令应该格外小心,因为新构建过程的上下文在缺少指定原文件时会失败
网友评论