dockerfile是用来构建docker镜像的文本文件,记录了镜像构建的所有步骤
1、编写dockerfile文件
2、docker build 命令构建镜像
3、docker run 以镜像运行容器
镜像缓存特性:如果某镜像层已经存在,就直接使用,无需重新构建。
dockerfil中的每个指令都会创建一个镜像层,上层是依赖下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。
dockerfile由一行行命令语句组成,并且支持以#开头的注释行
dockerfile的指令是忽略大小写的,建议使用大写,每行只支持一条指令,每条指令可以携带多个参数
dickerfile的指令根据作用可以分为两种:
1、构建指令:用于构建image,其指定的操作不会在运行image的容器上执行
2、设置指令:用于image,其指定的操作将运行image的容器中执行
一般的dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动该时执行指令。
指定base镜像,必须只当在dockerfile其他指令的前面,后续的指令都是依赖于该指令的指定镜像
该指令由有令两种格式;
1、FROM <image>
2、FROM <image>:<tag>
设置镜像作者,可以时任意字符串,用于将image的制作这信息写入到image中当我们对image执行
格式:MAINTAINER <name>
现在已经被“LABEL maintainer=”取代“
将文件从build context 复制到镜像
COPY支持两种形式
COPY src ... dest
COPY [ "SRC",....."dest"]
于COPY类似,从build context 复制文件到镜像。不同的是他会在粗制的过程中将归档文件释放
格式分为两种;
1、ADD <src>... <dest>
2、ADD ["<src>",... "<dest>"]
设置环境变量,环境变量可被后面的指令使用,并在容器运行时保持
格式:ENV <key> <value>
格式:EXPOSE <port> [<port>/<protocol>...]
可以指定TCP或UDP,默认是TCP
告诉Docker服务器暴露的端口号,供互联系统使用。
在启动容器的时候如果使用-P,Docker主机自动分配一个端口和容器端口映射。
在启动容器的时候如果使用-p,则可以具体指定哪个宿主机端口和容器端口映射。
当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。
格式:VOLUME ["<mountpoint>"]
将文件或目录声明为volume。使用容器种的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用也可以共享给其他的容器使用。
格式:WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
在构建镜像过程中要指定的命令
容器启动时运行指定的命令
dockerfile 中可以有多个CMD命令,但只有最后一个生效
设置容器启动时运行的命令。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。
当服务不需要管理员权限时,可以通过该命令指定运行用户。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
容器健康状况检查命令
语法有两种:
1. HEALTHCHECK [OPTIONS] CMD command
2. HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三种选项:
--interval=DURATION 两次检查默认的时间间隔为30秒,间隔(s秒、m分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查,随后每间隔interval秒进行一次健康检查;还有一种特例请看timeout解析。
--timeout=DURATION 健康检查命令运行超时时长,默认30秒,执行command需要时间,比如curl 一个地址,如果超过timeout秒则认为超时是错误的状态,此时每次健康检查的时间是timeout+interval秒。
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
注意:
HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。
CMD关键字后面可以跟执行shell脚本的命令或者exec。CMD后面的命令执行完的返回值代表容器的运行状况,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作了
2: reserved - 保留值
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1
健康检查命令是:curl -f http://localhost/ || exit 1
两次检查的间隔时间是5秒
命令超时时间为3秒
格式: ARG <参数名>[=<默认值>]
格式: ARG <参数名>[=<默认值>]
ARG构建参数和 ENV 的效果一样,都是设置变量。所不同的是, ARG 所设置的构建环境的变量,在将来容器运行时是不会存在这些变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
ARG是唯一一个可用于FROM前的指令
ARG CODE_VERSION=latest
FROM busybox:${CODE_VERSION}
给镜像增添加信息。使用docker inspect 可查看镜像的相关信息
语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
一个Dockerfile种可以有多个LABEL,如下:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号