docker
Dockerfile指令
RUN指令
RUN指令用于执行命令行命令,是最常用的指令之一
RUN指令有两种格式:
- 命令行格式
RUN <命令>
- 函数调用格式
RUN ["可执行文件", "参数1 ", "参数2"]
COPY指令
COPY 指令从上下文命令中<源路径>的文件/目录复制到向的一层镜像内的<目标路径位置>、
源路径可以是多个,甚至可以包含通配符
目标路径可以是容器内的绝对路径,也可是相对于工作目录的相对路径,无需事先创建,指定目录不存在时将自动创建路径
--chown=<user>:<group>选项可以用来改变文件的用户及所属组
元数据:在使用COPY指令时,源文件的各种元数据均会保留,如权限及修改时间等
COPY 指令也有两种格式
- 命令行格式
COPY [--chown=<user>:<group>] <源路径> ... <目标路径>
- 函数调用格式
COPY [--chown=<user>:<group>] ["<源路径1>", ...“<目标路径>”]
ADD指令
ADD指令的作用与COPY指令类似,但ADD指令支持源路径为URL,且若源路径为压缩文件,则将自动解压缩到目标路径
值得注意的是,ADD指令会使镜像构建缓存失效,使得镜像构建较慢
官方建议:尽量使用COPY指令,因为符合单一职责原则,语义简单
CMD指令
CMD指令用于指定默认容器主进程的启动命令,即docker run 时默认的命令,也可在运行时指定新的命令来代替CMD中的命令。
CMD类似于RUN指令,也有两种格式,推荐使用函数调用格式,因为命令行格式需要自动调用sh -c来执行命令行。
值得注意的是,docker中的应用只能前台运行,主进程退出后,容器将会退出
ENTRYPOINT指令
当指定了ENTRYPOINT指令后,CMD指令的内容将会作为参数传递给ENTRYPOINT指令,运行时参数也是如此
ENTRYPOINT指令还可用于在主进程执行前运行一段脚本,在脚本的最后执行运行时指定的CMD参数
ENV指令
ENV指令用于设置环境变量,后续指令及运行时应用均可使用此处定义的环境变量
格式为:
代码语言:shell复制 //格式一
ENV <key> <value>
//格式二
ENV <key1>=<value1> <key2>=<value2>
ARG指令
ARG指令类似于ENV指令,能够设置环境变量,但容器运行时无法使用此处的环境变量
生效范围:如果在FROM指令之前指定,则只能用于FROM指令中,需要在FROM之后再次指定,其后的指令才能使用该环境变量
格式:
代码语言:shell复制 ARG <参数名>[=<默认值>]
VOLUME指令
VOLUME指令用于指定匿名卷,防止容器运行时向容器存储层写入大量数据
格式:
代码语言:shell复制 //格式一
VOLUME ["<路径1>", "<路径2>", ...]
//格式二
VOLUME <路径>
WORKDIR指令
WORKDIR指令可以用来指定工作目录,之后各层的当前目录将被改为该目录,若该目录不存在,则将自动创建
如果使用的是相对路径,则路径与之前的WORKDIR指令有关
格式:
代码语言:shell复制 WORKDIR <工作目录路径>
//相对路径示例
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
//输出为 /a/b/c
EXPOSE指令
EXPOSE指令声明容器运行时提供服务的端口,但仅仅是声明,不会因为此声明而开启端口,而是需要对应的命令
USER指令
UESR指令用于改变之后指令的身份,切换到指定的用户,但该用户必须已经存在
如果在脚本中切换身份,建议使用 gosu,因为su或sudo需要进行额外配置且容易出错
格式:
代码语言:shell复制 USER <用户名>[:<用户组>]
HELTHCHECK指令
HELTHECHECK指令用于判断容器状态是否正常,支持以下选项:
- --interval=<间隔>,两次健康检查的间隔,默认为30s HEALTHCHECK [选项] CMD <命令> //屏蔽基础镜像的HEALTHCHECK指令 HEALTHCHECK NONEONBUILD指令ONBUILD指令用于在以当前镜像为基础镜像构建镜像时执行一些指令 格式: ONBUILD <其他指令>LABEL指令LABEL指令用于给镜像以键值对的形式添加元数据,还可以使用标签来声明镜像作者,文档地址等信息 格式: LABEL <key>=<value> <key>=<value>...SHELL指令SHELL指令用于指定RUN、ENTRYTPOINT、CMD等指令的shell,linux中默认为"/bin/sh", "-c" 格式:
- --timeout=<时长>,该指令运行时间,若超过此时间,则被视为失败,默认值为30s
- --retries=<次数>,当连续失败指定次数之后,将容器状态视为unhealthy,默认值为3次 此外,与CMD、ENTERYPOINT指令相同,一个Dockerfile中只能出现一次此指令,若出现多次则最后一个生效 格式:
SHELL ["executable", "parameters"]
多阶段构建
docker支持多阶段构建,支持只构建某一阶段的镜像,构建时从其他镜像复制文件