什么是 Dockerfile?
Dockerfile
是用于构建自定义 Docker 镜像的文本文件,是由一系列命令和参数构成的脚本。我们通过docker build
命令把 Dockerfile 构建成镜像。
Dockerfile 文件的基本结构
Dockerfile
一般分为:基础镜像、镜像元信息、镜像操作指令和容器启动时执行指令。
Dockerfile 文件说明
Docker 从上到下的顺序运行 Dockerfile 的指令。
#
字符为 Dockerfile 中的注释。文件一般命名为 Dockerfile。
Dockerfile 常用的指令
- FROM 指令
FROM
是指定基础镜像,定制的镜像都是基于 FROM 的镜像。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
其中 tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像。
示例:FROM node:12.14.1
MAINTAINER指令
MAINTAINER
用来声明维护者信息,但该命令已经过期,推荐使用 LABEL。
格式:
MAINTAINER <name> 镜像维护者的姓名和邮箱地址
- LABEL 指令
LABEL
用于添加元数据到镜像,声明构造信息、作者、机构等。LABEL 是以键值对形式出现。
格式:
LABEL <key>=<value> <key>=<value> ...
- ENV
设置环境变量,在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value> #<key>后面的所有内容均视为<value>的一部分,因此一次只能设置一个变量。
ENV <key>=<value> <key>=<value> ... #可设置多个环境变量。
我们可以通过 ${key} 在其它指令中来引用变量, 也可以通过 docker run 中的 -e <ENV> 来动态赋值。
- ARG 指令
构建参数,与 ENV 作用一至。不过作用域不一样。ARG
设置的环境变量仅对 Dockerfile 内有效,也就是说只有docker build
的过程中有效,构建好的镜像内不存在此环境变量。
ARG
用于传递给构建运行时的变量。ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令docker build
中用--build-arg <参数名>=<value>
来覆盖。
格式:
ARG <参数名>[=<默认值>]
在1.13之前的版本,要求--build-arg
中的参数名,必须在 Dockerfile 中用 ARG 定义过,否则会报错退出构建。从1.13开始这种严格的限制被放开,不再报错退出,而是显示警告信息,并继续构建。
- WORKDIR 指令
WORKDIR
指定工作目录。在创建容器后,终端默认登录进入的目录。
格式:
WORKDIR <PATH>
通过 WORKDIR 设置工作目录,Dockerfile 中的其它指令 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run
运行容器时,可以通过-w
参数覆盖构建时所设置的工作目录。
- ADD 指令
ADD
用于将本地文件添加到镜像中,tar
类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
。
格式:
ADD <源路径src> <目标路径dest>
- COPY 指令
COPY
的功能类似于ADD
,但是不会自动解压文件,也不能访问网络资源。
- RUN 指令
RUN
用来执行构建镜像时的命令。
格式:
shell 执行格式:RUN <命令行>
exec 执行格式:RUN ["可执行文件", "参数1", "参数2"]
RUN
指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用缓存镜像,可在docker build
构建时指定--no-cache
参数。
- CMD 指令
CMD
是在容器启动时才执行的命令。格式跟RUN
类似。如果Dockerfile
中存在多个 CMD 指令,仅最后一个生效。
- ENTRYPOINT 指令
ENTRYPOINT
与CMD
非常类似,不同的是通过docker run
执行命令携带的参数不会覆盖ENTRYPOINT
,而是传递给它。
- EXPOSE 指令
EXPOSE
是声明运行时容器提供服务端口号。
格式:
EXPOSE [<port>...]
- VOLUME 指令
VOLUME
用于指定持久化目录。
VOLUME ["<路径1>", "<路径2>"...]
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
- USER 指令
USER
指定运行容器时的用户名或 UID。
USER <用户名>[:<用户组>]
如果使用USER
指定用户,Dockerfile 中其它命令 RUN
、CMD
、ENTRYPOINT
都将使用该用户。你可以通过docker run
运行容器时,可以通过-u
参数来覆盖指定用户。
- ONBUILD 指令
ONBUILD
作用是当所构建的镜像被用做其它镜像的基础镜像,该镜像中的ONBUILD 命令就会触发。
ONBUILD <其它指令>