1. Dockerfile 简介
-
Dockerfile 是什么
Dockerfile 是镜像的描述文件
-
Dockerfile 的作用
通过 Dockerfile 文件我们可以自定义一个的镜像并构建出来
-
通过 Dockerfile 构建镜像的步骤
- 在指定位置创建一个 Dockerfile 文件
- 通过 Dockerfile 构建镜像
docker build -t <image_name>:<version> <Dockerfile 文件位置>
在构建镜像的过程中,会在 Docker Cache 中生成每一条命令对应的临时镜像 tmp Image,以便于在 Dockerfile 被修改重新构建镜像时加快构建的速度,可以在构建时使用 --no-cache
命令取消缓存
下面是一些概念之间的关系
2. Dockerfile 基本语法
Dockerfile 语法官方网站: https://docs.docker.com/engine/reference/builder/
2.1 Dockerfile 内容基础
- 每条保留字指令都必须为大写,且后面都要跟至少一个参数。
- 指令按照从上到下,顺序执行。
#
表示注释。- 每条指令都会创建一个新的镜像层,并对镜像进行提交。
2.2 Dockerfile 保留字
保留字 | 作用 |
---|---|
FROM | 当前镜像所基于的镜像 第一个指令必须是FROM |
RUN | 构建镜像时需要运行的指令 |
EXPOSE | 声明容器对外暴露的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 包 |
COPY | 类似于 ADD,拷贝文件和目录到镜像中 将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令 ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数 |
FROM 指令
当前镜像所基于的镜像,在构建时会自动从 Docker Hub 拉取 base 镜像
必须作为 Dockerfile 的第一个指令出现
语法
FROM <image>
FROM <image>[:<tag>]
FROM <image>[@<digest>]
RUN 指令
RUN 指令将在当前映像之上的新层中执行任何命令并提交结果
生成的提交映像将用于 Dockerfile 中的下一步
语法
RUN <command> (shell form, the command is run in a shell, which by
default is `/bin/sh -c` on Linux or `cmd /S /C` on Windows)
RUN echo hello
RUN ["executable", "param1", "param2"] (exec form)
RUN ["/bin/bash", "-c", "echo hello"]
EXPOSE 指令
用来指定构建的镜像在运行为容器时对外暴露的端口
没有实际的作用,仅仅用于声明要暴露的端口
语法
EXPOSE 80/tcp 如果没有指定则默认暴露 tcp
EXPOSE 80/udp
WORKDIR 指令
用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录
如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也将被创建
语法
WORKDIR /path/to/workdir 指定原始镜像存在目录不存在目录
WORKDIR /a
WORKDIR b
WORKDIR c
注意: WORKDIR 指令可以在 Dockerfile 中多次使用。
如果提供了相对路径,则该路径将与先前 WORKDIR 指令的路径相对
ADD 指令
用来从 context 上下文复制新文件、目录或远程文件 url,并将它们添加到位于指定路径的映像文件系统中
语法
ADD hom* /mydir/ 通配符添加多个文件
ADD hom?.txt /mydir/ 通配符添加
ADD test.txt relativeDir/ 可以指定相对路径
ADD test.txt /absoluteDir/ 也可以指定绝对路径
ADD url 可以直接下载链接的文件
COPY 指令
阉割版的 ADD 指令,仅可用于从 context 上下文复制新文件、目录,并将它们添加到位于指定路径的映像文件系统中
ENV 指令
用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中
语法
ENV <key> <value>
ENV <key>=<value>
使用 $ 符号进行引用
WORKDIR $key
VOLUME
用于定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
语法
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
CMD & ENTRYPOINT 指令
都是用来指定容器启动时默认执行指令
注意:CMD 指令可以存在多个但是存在多个只有最后一个生效
语法
RUN <command>
RUN ["executable", "param1", "param2"] 推荐
区别
-
CMD 里面命令如果在运行容器时进行覆盖
docker run <image>[:<version>] 覆盖命令
-
ENTRYPOINT 里面命令如何在运行容器时进行覆盖
docker run --entrypoint=覆盖指令 <image>[:<version>] 传递参数
组合使用方式
ENTRYPOINT 用来书写一个容器固定的指令
CMD 用来给 ENTRYPOINT 传递参数
注意:配合使用时必须使用 RUN ["executable", "param1", "param2"]
语法