Dockerfile教程
什么是Dockerfile
Dockerfile
是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile
基本结构:基础镜像、镜像元信息、镜像操作指令、容器启动时执行命令。
为什么要用Dockerfile
用户可将自己的应用打包成镜像,从而让应用在容器中运行,还可对官方镜像进行扩展,打包成适合自己的应用镜像。完整的镜像结构图如下:
Dockerfile指令
1. FROM
from
指定基础镜像。
语法格式
FROM <image> FROM <image>:<tag> FROM <image>@<digest>
注意:
- FROM指令必须为第一个命令。
- tag或 digest非必须,不指定即使用 latest版本的基础镜像。
MAINTAINER
MAINTAINER
指定 Dockerfile的作者/维护者。(已弃用,推荐使用 LABEL指令)
语法格式
MAINTAINER <author>
LABEL
LABEL
用于为镜像添加元数据
语法格式
LABEL <key>=<value> <key>=<value> <key>=<value> ...
注意:
一条 LABEL指令可指定一条或多条元数据。推荐使用将所有元数据通过一条 LABEL指令指定,防止生成过多的中间镜像。
RUN
RUN
构建过程中在镜像中执行的命令。
语法格式
# RUN 用于构建镜像时执行的命令,有两种执行方式#Shell 执行RUN <command># exec 执行RUN ["executable", "param1", "param2", ...]
注意:
- 多行命令不要写多个 RUN,多行 RUN指令会建立多层,多层会导致镜像的臃肿。
- RUN 指令创建的中间镜像会被缓存,可在下次构建中使用,若不想使用这些缓存镜像,在构建时指定 –no-cache参数。
CMD
CMD
指定容器创建时的默认命令。(可被覆盖
)
语法格式
# 执行可执行文件
CMD ["executable", "param1", "param2", ...]# 执行 Shell 命令
CMD command param1 param2 ...# 设置 ENTRYPOINT,直接调用 ENTRYPOINT 添加参数
CMD ["param1", "param2", ...]
注意:
- D
- 多个
CMD
指令,只有最后一个生效
ENTRYPOINT
ENTRYPOINT
指定容器创建时的默认命令。(不可被覆盖
)
语法格式
# 执行可执行文件
ENTRYPOINT ["executable", "param1", "param2", ...]# 执行 Shell 命令
ENTRYPOINT command param1 param2 ...
注意:
Dockerfile
中仅执行一个 ENTRYPOINT指令,多次设置指定,后面的会覆盖前面的设置。ENTRYPOINT
指令仅在docker run
执行命令时指定了--entrypoint
参数时,才会被覆盖。
ENV
ENV
设置环境变量,后续指令可使用这个环境变量。
语法格式
ENV <key> <value> # 此种形式一条指令只能设置一个变量
ENV <key>=<value> <key>=<value> ...
EXPOSE
EXPOSE
指定容器运行时监听的端口
语法格式
EXPOSE <port> ...
VOLUME
VOLUME
为容器设置挂载点(指定持久化目录)
语法格式
VOLUME [<path> ...]
WORKDIR
WORKDIR
用于设置后续指令的工作目录
语法格式
WORKDIR path
ADD
ADD
用于将本地文件、目录或远程URL复制到镜像中。(路径支持通配符)
语法格式
ADD <src> ... <dest>
ADD ["<src>" ... "<dest>"] # 支持包含空格的路径
注意:
ADD
指令可自动将 tar类型文件自动解压(网络资源不会被解压)ADD
指令可访问网络资源,类型 wget
COPY
COPY
用于将文件、目录复制到镜像中
语法格式
COPY <src> ... <dest>
COPY ["<src>" ... "<dest>"] # 支持包含空格的路径
注意:
COPY
指令不会自动将 tar类型文件进行解压COPY
指令不能访问网络资源
USER
USER
用于指定运行容器的用户名和UID,后续 RUN、CMD、ENTRYPOINT 命令都将使用该用户。
语法格式
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
ARG
ARG
用于指定传递给构建运行时的变量
语法格式
ARG <name>[=<default value>]
ONBUILD
ONBUILD
用于设置镜像触发器
语法格式
ONBUILD [INSTRUCTION]
注意:
ONBUILD后跟指令,当当前的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。
使用Dockerfile构建镜像
Dockerfile工作原理
样例
启动springboot项目
FROM openjdk:8
WORKDIR /root
ADD springboot-0.0.1-SNAPSHOT.jar springboot.jar
EXPOSE 8888
ENTRYPOINT ["java", "-jar"]
CMD ["springboot.jar"]
Dockerfile构建镜像
docker build
命令用于读取 Dockerfile
中定义的指令,并根据上下文,逐步构建 Docker镜像,并将最终结果保存到本地镜像库中。
语法格式
docker build [options] path | URLpath 本地文件系统上的一个目录路径URL 远程存储库地址
常见选项:
- -t/–tag 指定镜像名称和标签
- -f/–file 指定 Dockerfile的路径 (默认当前路径)
- –build-arg 设置构建参数
- –rm 构建成功后删除中间容器(默认开启)
- –force-rf 强制删除中间容器(无论构建成功与否)
- –pull 始终尝试从注册表拉取最新的基础镜像
- -m 设置内存最大值
- –no-cache 设置构建镜像时不适用缓存