Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。 Dockerfile的指令根据作用可以分为两种:构建指令和设置指令。 构建指令用于构建image,其指定的操作不会在运行image的容器上执行; 可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录。 DockerFile的每一个指令都会新构建一层。 UnionFS是有最大层数限制的,比如AUFS,曾经是最大不能超过42层,现在是最大不能超过127层。所以,对于一些编译、软件的安装、更新等操作,无需分成好几层来操作,这样会使得镜像非常臃肿,拥有非常多的层,不仅仅增加了构建部署的时间,也很容易出错!! | ||
指令 | 描述 | 格式 |
from | 构建指令。 指定基础镜像,它是最重要的一个且必须为dokefile文件开篇的第一个非注释行,用于为镜像文件构建过程中指定基础镜像,后续的指令运行于此基准镜像所提供的运行环境 默认,docke会在本机寻找指定的镜像,找不到的时候则从docke hub registery拉取所需镜像,如果会找不到,则报错返回报错信息 如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令。 DockerFile还存在一个特殊的镜像 如果你以 | from <repository>[:<tag>]或者 from <repository>@<digest> repository为基础镜像名称 tag为镜像标签为可选项,省略时为latest该image的最后修改的版本 |
MAINTAINER | 构建指令 用于为docke提供作者信息,无顺序限制 用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。 此命令已经过时,可以使用LABEL maintainer=xxx 来替代,定义多个LABEL时,可以使用 【\】反划线来跨行 | |
copy | 用于从docker主机复制文件至创建的新镜像文件,但不会自动解压,不能从【 远端URL 】 复制。 目标路径是容器内的绝对路径,也可以是工作目录下的相对路径,工作目录可以使用 使用 <源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则 目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录 在使用该指令的时候还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户及所属组。 文件复制准则: | |
add | 构建指令
如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;
目标路径为一个URL时,会将其自动下载到目标路径下,但是其权限被自动设置成了 当你的源路径为压缩文件并且不想让Docker引擎将其自动解压缩,这个时候就不可以使用 | |
run | 构建指令。 每条 RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令 | shell格式 exec格式 前者将在 shell 终端中运行命令,即 |
volume | 设置指令 用于构建镜像时定义匿名卷。 容器存储层应该保持无状态化,容器运行时应尽量保持容器内不发生任何写入操作,对于需要保存动态数据的应用,其数据文件应该将其保存在数据卷中。 容器匿名卷目录指定可以通过 如果挂载点目录下此前存在文件,docker run命令会在卷挂载完成之后将此前的所有文件复制到新挂载的卷中
|
|
expose | 设置指令
在Dockerfile中这样声明有两个好处:一个是帮助镜像使用者更好的理解这个镜像服务的守护端口,另一个作用则是在运行时使用随机端口映射时,也就是 要将 EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。 | EXPOSE 端口号 EXPOSE 端口号/协议 默认协议为TCP |
env | 设置指令 指定环境变量,它可以被其后的add、copy等调用
如果你要设置多个环境变量,为了美观,你可以使用 值得注意的是,如果你想通过 CMD ["echo", $MODE] CMD ["echo", "$MODE"] 上面这样都是不能正确输出环境变量的值的,你可以改成exec格式来执行shell命令,如下 CMD ["sh", "-c", "echo $MODE"] | 调用格式$name或者${name} |
wokrdir | 设置指令 使用
| |
user | 设置指令 指令用于将会用以什么样的用户去运行默认为root 可以指定用户名或者UID,组名或者GID,或者两者的结合
后续的 当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: | |
healthcheck | 告诉Docker该如何判断容器的状态是否正常,这是1.12引入的新指令 在没有
| HEALTHCHECK [options] CMD <命令>:检查容器健康状态的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,这一行将会屏蔽掉其健康检查指令 HEALTHECHECK支持下列选项: –interval=<间隔>:两次检查的时间间隔,默认为30s –timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查将会判定 为失败,默认为30s –retries=<次数>:当连续失败指定次数之后,则将容器状态视为 |
onbuild | ONBUILD 是一个特殊的指令,它后面跟着的是其他指令,比如COPY 、RUN 等,而这些命令在当前镜像被构建时,并不会被执行。只有以当前镜像为基础镜像去构建下一级镜像时,才会被执行 | ONBUILD <其他指令> |
shell | 指定Dockerfile中 【 shell form 】命令的默认shell。 Linux中默认shell为 【 “/bin/sh”, “-c”】 | |
arg | 构建参数
| |
cmd | 设置指令。 Docker不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,就需要指定运行的程序及参数。 每个 Dockerfile 只能有一条 如果用户启动容器时候指定了运行的命令,则会覆盖掉 这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array 一些命令在加上 | exec格式 使用 shell格式
|
entrypoint | 设置指令 指定容器运行程序及参数 配置容器启动后执行的命令,并且不可被 每个 Dockerfile 中只能有一个
| exec格式 shell格式 |
DOCKERFILE参数注解
最新推荐文章于 2024-03-06 18:09:11 发布