FROM
FROM指令初始化一个新的构建阶段,并为后续指令设置基本映像。 因此,有效的Dockerfile必须以FROM指令开头。 该基础镜像可以是任何有效镜像(从公共存储库中能够很容易地拉出基础镜像)。
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
- --platform 可选项,用于多平台镜像场景,该标志可指定镜像的平台
- image 必选项,指定基础镜像,进项名称
- :tag和@digest 可选项,指定镜像的标签,都不填默认使用 latest 标签对应的镜像
- AS name 可选项,为新的构建阶段指定名称,该名称可以在后续的FROM和COPY --from = <名称>指令中使用,以引用此阶段中构建的映像
ARG 是唯一可以在FROM指令之前的指令,ARG指令在第一FORM之前定义的变量参数值只能在后面的FROM命令中使用,要想在FROM的后续指令中使用需要再利用 ARG 指令指定一个指定一个同名的不赋值的参数变量
RUN
RUN指令将在当前镜像顶部的新层中执行任何命令,并提交结果。 生成的提交镜像将用于Dockerfile中的下一步。
shell form(shell形式)
shell形式的RUN指令,指令后的command命令在一个shell中被执行,默认是在 /bin/sh -c(Linux)或者 cmd /S /C (Windows)中。
RUN <command>
- command可以值任何命令
- 可以使用 \ (反斜杠)续行
RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME'
exec form(可执行形式)
RUN ["executable", "param1", "param2"]
- executable 可执行程序
- param1 param2 … 向可执行程序传入的参数
- exec 形式的RUN指令后面是一个Json array,所有要包含在[ ](一对中括号)直接,并且内容要用双引号包裹
- 在Json格式中,反斜杠 \ 需要转义
- exec 形式下不会有变量替换
CMD
CMD 指令的主要目的是为执行中的容器提供默认值。 这些默认值可以包含可执行文件,也可以省略可执行文件,如果省略,必须指定ENTRYPOINT(入口点)指令。
Dockerfile中只能有一条CMD指令。 如果您列出多个CMD,则只有最后一个CMD才会生效。
如果用户为 docker run 指定了参数(执行命令),则它们将覆盖CMD中指定的默认值。
-
shell 形式
CMD <command> param1 param2
command 命令将在 /bin/sh -c 下执行
-
exec 可执行形式(推荐使用)
CMD ["executable","param1","param2"]
Json array 格式
executable:可执行程序的全路径 -
为入口点设置默认参数形式
CMD ["param1","param2"]
必须同时指定 ENTRYPOINT 指令,这里的参数传递到入口点,ENTRYPOINT 指令也必须是Json数值格式
如果希望容器每次都运行相同的可执行文件,则应考虑将ENTRYPOINT与CMD结合使用。
LABEL
LABEL指令将元数据添加到图像。设置镜像的标签。 LABEL是键值对。键值中有空格需要使用双引号引起来。
LABEL <key>=<value> <key>=<value> <key>=<value> ...
- 一个镜像可以有多个元数据,所有Dockerfile可以有多个LABEL指令,也可以在一个LABEL中指定多组元数据。
- 镜像将继承基础镜像(父镜像)的元数据,如果有相同的键值,以最近的镜像为准。
- LABEL指令也可以用 \ 表示行连续
- 镜像元数据可以通过docker inspect 命令查看
docker image inspect --format='' myimage
{ "com.example.vendor": "ACME Incorporated", "com.example.label-with-value": "foo", "version": "1.0", "description": "This text illustrates that label-values can span multiple lines.", "multi.label1": "value1", "multi.label2": "value2", "other": "value3" }
MAINTAINER (deprecated)
该指令官网标记被弃用了,并推荐使用 LABEL 指令作为替代。
MAINTAINER 指令设置所构造新镜像的“作者”字段。 LABEL指令是此指令的更为灵活的版本,您应该使用它,因为它可以设置所需的任何元数据,并且可以轻松查看,例如使用docker inspect。 要设置与MAINTAINER字段相对应的标签,您可以使用:
LABEL maintainer="SvenDowideit@home.org.au"
EXPOSE
设置镜像暴露端口,记录容器启动时监听哪些端口。EXPOSE 指令通知Docker容器在运行时在指定的网络端口上进行侦听。 该指令同时可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。
EXPOSE <port> [<port>/<protocol>...]
EXPOSE指令实际上不会发布端口。发布端口需要 docker run 命令在启动容器时通过特定标志配合:
- EXPOSE 指令需要于 docker run 命令的 -P 标志配合,发布所有EXPOSE指令指定端口/协议,发布端口映射到宿主机随机的高阶端口上。
- docker run 命令的 -p 标志,可以覆盖EXPOSE 指令,映射端口都有 -p
docker network命令支持创建网络以在容器之间进行通信,而无需暴露或发布特定端口,因为连接到网络的容器可以通过任何端口相互通信。 有关详细信息,可以参考官网 docker network config 概述。
ENV
设置镜像中的环境变量。
ENV <key>=<value> ...
- 环境变量在整个编译周期都有效。
- 有空格时可以只用双引号将值引起来或者用反斜杠转义
- 支持 \ 续行
- docker run --env <key>=<value> 可以覆盖
- docker inspect 可查看
提示:通过 “${变量名}” 或者 “$变量名” 使用变量。
ADD
复制文件到镜像中。
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
ADD指令从<src>复制新文件、目录或远程文件URL,并将它们添加到新构建镜像的文件系统中的<dest>路径。
可以指定多个<src>资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。
每个<src>都可以包含通配符,并且匹配将使用Go的filepath.Match规则进行。
- --chown 选项只在Linux环境写的文件系统生效
- 如果路径中有空格,只能使用第二种形式的ADD指令
- 添加的文件如果有特殊字符需要按照Golang规则转义
- 当src为文件或目录时,Docker Daemon会从上下文中寻找这些文件或目录
- dest为镜像中的绝对路径或者相对于WORKDIR的路径
- src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身
- src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录
- 如果src为文件,则复制文件和元数据
- 如果dest不存在,指令会自动创建dest和缺失的上级目录
关于解压缩:是否将添加文件视作公认的压缩文件只取决于文件的内容而不时它的名称,比如:如果一个空文件被命名为 *.tar.gz ,那么ADD指令之后将它复制到镜像中,不会对其解压。另外,远端路径(URL)中的压缩文件不会被解压。
COPY
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY 指令的逻辑和ADD指令十分相似,同样Docker Daemon会从构建上下文目录寻找文件或目录,dest为镜像中的绝对路径或者相对于WORKDIR的路径。
VOLUME
设置容器的挂载点。官网详细说明
VOLUME ["/data"]
# or
VOLUME /data1 /data2
启动容器时,Docker Daemon会新建挂载点,并用镜像中的数据初始化挂载点,可以将主机目录或数据卷容器挂载到这些挂载点。
USER
USER指令设置运行镜像时要使用的用户名(或UID)以及可选的用户组(或GID),即指定Dockerfile中所有RUN,CMD和ENTRYPOINT指令执行时的用户名。
USER <user>[:<group>]
WORKDIR
设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录
WORKDIR <Path>
# eg. WORKDIR /path/to/workdir
- 如果工作目录不存在,则Docker Daemon会自动创建
- Dockerfile中多个地方都可以使用WORKDIR,如果后面的WORKDIR是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A WORKDIR B WORKDIR C,最终路径为/A/B/C)
ARG
设置构建镜像过程中使用的构建参数。
ARG <name>[=<default value>]
ARG 从定义它的地方开始生效,在ARG之前调用会得到空值
在构建镜像时(docker build命令),可以通过docker build --build-arg <var>=<value> 设置构建参数的值,如果用户指定了未在Dockerfile中定义的构建参数,则守护进程在构建时会输出警告。
可以使用ENV或ARG设置RUN使用的变量,如果同名则ENV定义的值会覆盖ARG定义的值
ARG 指令影响构建缓存。ARG变量不会像ENV变量那样持久保存到生成的映像中。 但是,ARG变量确实以类似的方式影响构建缓存。