Dockerfile是一个用来构建镜像的文本文件。
一、基础
Dockerfile是一个用来构建镜像的文本文件,它包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
组成
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
#
为注释内容
格式
1 | # Comment |
常用指令
FROM:指定基础镜像,并且必须是第一条指令。
- FROM
<image>
- FROM
<image>:<tag>
- FROM
<image>:<digest>
<tag>
和<digest>
是可选项,默认为latest
- FROM
MAINTAINER:作者信息
- MAINTAINER
<name>
- 新版docker中使用LABEL指明
- MAINTAINER
LABEL:指定标签
- LABEL
<key>=<value> <key>=<value> <key>=<value>...
- 一个Dockerfile种可以有多个LABEL
- LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
- LABEL
ADD:把文件复制到镜像中
- ADD
<src>...<dest>
- ADD
["<src>"..."<dest>"]
- 路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径
- 可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
- 如果把src写成一个url,那么ADD就类似于wget命令
- src如果为一个目录则会自动把目录下的文件复制过去,目录本身不会复制
- 如果src为多个文件,dest一定要是一个目录
- ADD
COPY:复制命令
COPY <src>...<dest>
COPY ["<src>"..."<dest>"]
- COPY的只能是本地文件
EXPOSE:暴漏容器运行时的监听端口给外部,不会使容器访问主机的端口
- EXPOSE
/<tcp/udp> - 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上-P参数
- EXPOSE
ENV:设置环境变量
ENV <key> <value>
一次一个ENV <key>=<value> ...
一次多个- 使用变量
- $varname
- ${varname}
- ${varname:-default value} 变量不存在使用-号后面的值
- $(varname:+default value} 当变量存在时使用+号后面的值
RUN:构件容器时运行的命令
RUN <command>
RUN ["executable", "param1", "param2"]
CMD:容器启动时运行的命令或参数
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
ENTRYPOINT:容器启动时运行得启动命令
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
- 和CMD对比
- 都是只能写一条,如果写了多条,那么只有最后一条生效
- 都是容器启动时才运行
- ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
- 如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
- 如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效
VOLUME:可以将宿主机目录挂载到容器中
VOLUME ["/data"]
USER:启动容器的用户,可以是用户名或UID
WORKDIR:设置工作目录,对RUN/CMD/ENTRYPOINT/COPY/ADD生效
ARG:设置变量
ONBUILD:设置二次构建指令——指定在构建镜像时并不执行而是在它的子镜像中执行。
STOPSIGNAL:允许用户定制化运行docker stop时的信号
HEALTHCHECK:健康检查指令,用来检查将来容器启动运行时是否正常。
基本规则
- Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
- Dockerfile中相对路径默认都是Dockerfile所在的目录
- Dockerfile中能写到一行的指令一定要写到一行,原因是分层构建,联合挂载这个特性。
- Dockerfile中每一条指令被视为一层