Dockerfile 简介
Dockerfile 是一个文本文件,里面包含组装新镜像时用到的基础镜像和各种指令。
Dockerfile 中以 # 号开头的行表示注释。
docker build
命令可根据 Dockerfile 来构建新镜像。
# 根据当前目录中的 Dockerfile 创建 image ,并给镜像命名(包括 tag)
docker build -t test:1.0 .
image 镜像
镜像是分层结构,Dockerfile 中的每条指令都会创建一个新的层次结构 layer,大大提升了镜像的可塑性和可重用性。
- baseImage:基础镜像,包含基本的系统函数库、环境变量、文件系统等底层支持。
- entrypoint:入口,是镜像中应用程序启动的命令。
- 其它:在 baseImage 基础上添加依赖、安装程序、完成整个应用程序的安装与配置。
Dockerfile 指令
详情可查看官方文档 https://docs.docker.com/engine/reference/builder/
FROM
语法:FROM <image>
FROM alpine:3.16
指定构建新镜像的基础镜像(基础镜像、父镜像),一般是操作系统或其他基础镜像。
如果本地没有该基础镜像,就会从 Docker 的远程仓库 pull。
FROM 必须是 Dockerfile 中非注释行的第一个指令。
FROM 可以在一个 Dockerfile 中出现多次。
如果 FROM 语句没有指定基础镜像的 tag 标签,则默认使用 latest 标签。
MAINTAINER
语法:MAINTAINER <name>
指定镜像的维护者信息。
ENV
语法: ENV <name> <value>
定义环境变量。可在后面使用,在容器运行时保留。
# 定义环境变量 $MYSQL_ROOT_PASSWORD 的值为 123456
ENV MYSQL_ROOT_PASSWORD=123456
WORKDIR
语法:WORKDIR <dirname>
设置工作目录。它是 RUN、CMD、ENTRYPOINT、ADD、COPY 的当前工作目录。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 最终路径是/a/b/c
WORKDIR 指令可以在 ENV 设置变量之后调用环境变量。
# 最终路径是 /path/$DIRNAME
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
ADD
语法:ADD <src> <dest>
将宿主机的文件拷贝到新镜像的目录中。
可以是文件或者目录。如果是文件,表示拷贝文件本身;如果是目录,只会拷贝该目录中的所有文件(不包括目录本身)。(支持相对路径、远程 URL,支持 Go 的正则模糊匹配)
必须是绝对路径,如果不存在,就会自动创建。
# 将 Dockerfile 文件所在目录中的所有文件,拷贝至 /app 目录
ADD . /app
COPY
COPY 的用法与 ADD 相同,但 COPY 不支持远程的 URL。
RUN
语法:RUN <cmd>
指定构建新镜像时运行的 shell 命令。一般是安装过程的命令。
每条 RUN 指令将在当前镜像基础上执行指定的命令,并提交为新的镜像,后续的 RUN 都以之前 RUN 提交后的镜像为基础。
镜像是分层的,可以基于镜像的任何一个历史提交点来创建新的镜像。
RUN 产生的缓存在下一次构建镜像时默认不会失效,会被重用,但可以通过 --no-cache 选项禁用缓存。
CMD
语法:CMD <cmd>
指定新镜像的容器启动时默认运行的命令。
CMD 命令如果有多个,只有最后一个会生效。
CMD 的作用是在启动容器时提供一个默认的命令执行。
如果用户启动容器时指定了运行的命令,则会覆盖掉 CMD 指定的命令。
注意:CMD 在启动容器时执行,build 时不执行;而 RUN 只在 build 时执行,用于镜像的构建过程。
EXPOSE
语法:EXPOSE <port> [<port>...]
指定镜像的容器实例监听(对外服务)的端口,可指定多个端口,是给镜像使用者看的。
# 指定镜像的容器实例监听的端口为 80
EXPOSE 80
VOLUME
语法:VOLUME <dir>
创建一个可以从宿主机或其他容器挂载的挂载点。
ENTRYPOINT
ENTRYPOINT java -jar my.jar
镜像的入口,一般是应用程序启动的命令和参数,容器运行时自动执行。