ARG-设置环境变量
构建参数ARG
和ENV
指令一样,都是设置环境变量。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build
的过程中有效,构建好的镜像内不存在此环境变量。即在将来容器运行时是不会存在这些环境变量的。但是不要因此就用ARG
来保存密码之类的信息,因为通过docker history
还是能够看得到的。
ARG构建命令在docker build
中可以用 --build-arg <参数名>=<值>
来覆盖。
语法格式如下:
ARG <参数名>[=<默认值>] 复制代码
示例:
FROM ubuntu:16.04 ARG app="python-pip" RUN apt-get update && apt-get install -y $app && rm -rf /var/lib/apt/lists/* # 我们可以定义多个参数 FROM busybox ARG user1 ARG buildno # 也可以给参数一个默认值 FROM busybox ARG user1=someuser ARG buildno=1 # 如果我们给ARG定义了参数默认值,那么当build镜像时,如果没有指定参数值,将会使用这个默认值。 复制代码
WORKDIR-指定工作目录
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build
构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,它的路径是相对此前一个WORKDIR指令指定的路径。另外,WORKDIR也可调用由ENV指定定义的变量。
格式:
WORKDIR <工作目录路径> 复制代码
样例:
WORKDIR /var/log # 解析环境变量 ENV DIRPATH /path WORKDIR $DIRPATH # 也可以设置多次 WORKDIR /a WORKDIR b WORKDIR c RUN pwd # pwd执行的结果是/a/b/c 复制代码
VOLUME-定义匿名数据卷
定义匿名数据卷,可实现挂载功能,可以将内地文件夹或者其他容器中得文件夹挂在到这个容器中。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。(容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。)
- 避免容器不断变大。
语法格式如下:
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径> 复制代码
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
样例:
# 定义一个匿名卷 FROM ubuntu:16.04 VOLUME /data # 定义多个匿名卷 FROM ubuntu:16.04 VOLUME ["/data", "/command"] 复制代码
这里的/data
和/command
目录在容器运行时会自动挂载为匿名卷,任何向/data
和/command
目录中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化!容器匿名卷目录指定可以通过docker run
命令中指定-v
参数来进行覆盖。
USER-指定执行后续命令的用户和用户组
用于指定执行后续命令的用户和用户组,这里只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。在USER命令之前可以使用RUN命令创建需要的用户。
默认情况下,容器的运行身份为root用户。
语法格式如下:
# 可以指定用户名或者UID,组名或者GID USER <user>[:<group>] USER <UID>[:<GID>] 复制代码
USER
指令还可以在docker run
命令中使用-u
参数进行覆盖。
样例:
RUN groupadd -r docker && useradd -r -g docker docker USER docker 复制代码
ONBUILD-用于延迟构建命令的执行
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build
,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
ONBUILD
是一个特殊的指令,它后面跟着的是其他指令,比如COPY
、RUN
等,而这些命令在当前镜像被构建时,并不会被执行。只有以当前镜像为基础镜像去构建下一级镜像时,才会被执行。
Dockerfile
中的其他指令都是为了构建当前镜像准备的,只有ONBUILD
指令是为了帮助别人定制而准备的。
语法格式如下:
ONBUILD <其他指令> 复制代码
样例:
from ubuntu:16.04 WORKDIR /data ONBUILD RUN mkdir test 复制代码
STOPSIGNAL
设置将发送到容器以退出的系统调用信号。这个信号可以是一个有效的无符号数字,与内核的syscall
表中的位置相匹配,如9
,或者是SIGNAME
格式的信号名,如SIGKILL
。
语法格式如下:
STOPSIGNAL signal 复制代码
默认的停止信号是SIGTERM
,在docker stop
的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal
可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出。如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s。
HEALTHCHECK-容器健康状况检查
用于指定某个程序或者指令来监控 docker 容器服务的运行状态是否正常。
语法格式如下:
# 设置检查容器健康状况的命令 HEALTHCHECK [OPTIONS] CMD <命令> # 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK NONE 复制代码
OPTIONS参数说明:
- –interval=<间隔> :两次检查的时间间隔,默认为30s
- –timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查将会判定为失败,默认为30s
- –retries=<次数> :当连续失败指定次数之后,则将容器状态视为
unhealthy
,默认为3次。 - --start-period=DURATION:启动时间,默认为0s, 如果指定这个参数, 则必须大于 0s ;
--start-period
为需要启动的容器提供了初始化的时间段, 在这个时间段内如果检查失败, 则不会记录失败次数。 如果在启动时间内成功执行了健康检查, 则容器将被视为已经启动, 如果在启动时间内再次出现检查失败, 则会记录失败次数。
在 CMD
关键字之后的 command
可以是一个 shell 命令(例如: HEALTHCHECK CMD /bin/check-running
)或者一个 exec 数组(与其它 Dockerfile 命令相同, 参考 [ENTRYPOINT])。
该命令的返回值说明了容器的状态, 可能是值为:
- 0: healthy - 容器健康,可以使用;
- 1: unhealthy - 容器工作不正常,需要诊断;
- 2: reserved - 保留,不要使用这个返回值;
当容器的健康状态发生变化时,会生成一个带有新状态的 health_status
事件。
样例:
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1 复制代码
注意:
和
CMD
、NETRYPOINT
一样,HEALTHCHECK
指令只可以出现一次,如果有多个HEALTHCHECK
指令,那么只有最后一个才会生效!
SHELL-重写xxx指令的shell格式所使用的默认shell
SHELL
指令允许重写xxx指令的shell格式所使用的默认shell。关于默认的shell
,Linux
是["/bin/sh", "-c"]
,Windows
是["cmd", "/S", "/C"]
。
SHELL
指令必须在dockerfile
中以JSON
格式编写。
SHELL
指令在 Windows 上特别有用,Windows 有两种常用且截然不同的本机 shell:cmd
和 powershell
,以及可用的备用 shell,包括 sh
。
SHELL
指令可以出现多次。 每条 SHELL 指令都会覆盖所有先前的 SHELL
指令,并影响所有后续指令。
样例:
FROM microsoft/windowsservercore # Executed as cmd /S /C echo default RUN echo default # Executed as cmd /S /C powershell -command Write-Host default RUN powershell -command Write-Host default # Executed as powershell -command Write-Host hello SHELL ["powershell", "-command"] RUN Write-Host hello # Executed as cmd /S /C echo hello SHELL ["cmd", "/S", "/C"] RUN echo hello 复制代码
当在 Dockerfile 中使用它们的 shell 格式时,以下指令可能会受到 SHELL 指令的影响:RUN
、CMD
和 ENTRYPOINT
。