Dockerfile:把镜像定制每一层添加的配置写入一个文件中,用这个脚本文件构建、定制镜像。可以解决无法重复的问题、镜像透明性问题、体积问题
1、FROM:指定基础镜像,指定基于哪个镜像来构建新的镜像,FROM命令必须为dockerfile文件的第一行
语法格式:
FROM <image>
FROM <image>:<tag> #<tag>为可选项,没有指定的话就使用latest
eg:
FROM ubuntu:latest
2、RUN:执行命令。构建镜像时运行的shell命令
语法格式:
RUN <command>
RUN ["excutable","parent1","parent2"...]
说明:dockerfile每一指令都会建立一层,RUN也是。多少个RUN就会构建多少层镜像。但由于多个RUN会使得镜像非常臃肿,多层镜像会增加部署的时间,还很容易出错。所以在写Dockerfile的时候,要尽量避免使用多个RUN,尽量将需要执行的命令卸载一个RUN。多条命令可使用\换行,换行前加上&&。还有需要将不需要的文件及目录删除,比如安装包、临时目录等,减少容器大小
3、MAINTAINER命令:用于声明作者
语法格式:
MAINTAINER [作者信息]
4、ENV:定义环境变量、永久变量,容器运行后仍然有效,即容器的永久变量
语法格式:
ENV <key> <value> #设置一个环境变量
ENV <key1>=<value1> <key2>=<value2> ... #设置多个环境变量
5、ARG:定义参数,即临时变量、只限于构建镜像时使用,容器运行后不会存在
语法格式:
ARG <参数名> #不设置默认值的话,需要使用--build-arg来设置参数的值
ARG <参数名>[=<默认值>] #设置参数的默认值
6、WORKDIR:指定工作目录,以后各层指令的当前目录就是此目录
语法格式:
WORKDIR <工作目录路径>
7、COPY:将上下文目录中的文件或目录复制到镜像内指定的目录下
语法格式:
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
注:源路径是一个压缩文件的话,将会解压到容器的目标路径下;原路径是一个URL路径的话,会下载或者解压到容器的目标路径之下
8、VOLUME:将本地卷挂载在容器中
语法格式:
VOLUME <路径>
VOLUME ["<路径1>","<路径2>"...]
注:容器使用的是AUFS,这种文件系统不能持久化数据。当容器关闭后,所有的更改都会丢失。当数据需要持久化的时候使用VOLUME指令,响挂载目录写入的任何信息都不会写入容器存储层,从而保证了容器存储层的无变化
10、EXPOSE:声明容器运行时提供的服务端口
语法格式:
EXPOSE <端口1> [<端口2>...]
注:docker run命令可使用-p <宿主端口>:<容器端口>将声明的端口映射到本地指定的端口。
11、USER:指定运行的用户,以后各层的RUN、CMD或者ENTRYPOINT等指令都会以这个用户身份执行
语法格式:
USER <用户名>
USER <UID>
12、CMD:容器运行时执行的shell命令,CMD指令一般应为Dockerfile文件的最后一行
语法格式:
CMD <命令>
CMD ["可执行文件", "参数1", "参数2"...]
13、ENTRYPOINT:容器运行时执行的shell命令,一般应为Dockerfile文件的最后一行
语法格式:
ENTRYPOINT <命令>
ENTRYPOINT ["可执行文件", "参数1", "参数2"...]
注:与CMD不同的是,当指定了ENTRYPOINT后,CMD不再是直接运行命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。
14、HEALTHCHECK:容器健康状态检查指令
语法格式:
HEALTHCHECK [选项] CMD <命令>
HEALTHCHECK NONE #如果基础镜像有健康检查指令,使用这行可以取消健康检查指令
HEALTHCHECK的选项有:
--interval=<间隔>:两次健康检查的间隔时间,默认为30秒
--timeout=<时长>:每次检查的超时时间,超过这个时间,本次检查就视为失败,默认30秒
--retries=<次数>:指定健康检查的次数,默认3次,如果指定次数都失败后,则容器的健康状态为unhealthy(不健康)
CMD命令的返回值决定了本次健康检查是否成功,命令的返回值如下: 0: success - 成功 1: unhealthy - 失败 2: reserved - 保留
如果镜像添加了健康状态检查,容器运行后,在STATUS下会显示健康状态。
15、ONBUILD:指定以当前镜像为基础镜像构建的下一级镜像运行的命令
语法格式:
ONBUILD <其它指令>
注:在当前镜像构建时不会执行,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。