Dockerfile的使用

小小码农 2021年08月20日 902次浏览

描述

通过读取Dockerfile中的指令,Docker可以自动构建镜像。Dockerfile是一种文本文档,其中包含用户在命令行上可以调用的所有命令来组装镜像。使用docker构建用户可以创建一个自动构建,它可以连续执行多个命令行指令。
另一种方式是在现有容器中添加完相关功能,执行docker commit,也会生成一个新的镜像。

使用

通过docker build命令从Dockerfile和上下文构建一个镜像,构建的上下文是指定位置PATH或URL上的一组文件,PATH是本地文件系统上的一个目录。URL是一个Git存储库位置。
构建上下文是递归处理的。因此,PATH包括任何子目录,URL包括存储库及其子模块。
构建是由Docker守护进程运行的,而不是CLI。构建进程要做的第一件事是将整个上下文(递归地)发送给守护进程。在大多数情况下,最好从一个空目录作为上下文开始,并将Dockerfile保存在该目录中。只添加构建Dockerfile所需的文件。
不要使用根目录/作为构建上下文的PATH,因为它会导致构建将硬盘的全部内容转移到Docker守护进程。

构建器命令、解析器命令、注释

一个DoKerfile是由构建器命令+解析器命令+注释组成。其中解析器命令是一种特殊的注释非必须。可以理解为Dockerfile主要以构建器命令为主,解析器命令注释为辅。

注释
字面意思,就是一些当前逻辑的一些注解或者一些版本信息等等。以#开头的行视为注释,除非该行是一个有效的解析器指令。行中任何其他位置的#标记都被视为参数。

解析器命令
解析器指令不会向构建中添加层,也不会显示为构建步骤。解析器指令被写成一种特殊类型的注释,形式为# directive=value。一个指令只能使用一次。
一旦处理了注释、空行或构建器指令,Docker就不再寻找解析器指令。相反,它将任何格式化为解析器指令的内容视为注释,并且不尝试验证它是否可能是解析器指令。因此,所有解析器指令必须位于Dockerfile的最顶端。
解析器指令不支持行延续字符。

构建器命令
字面意思,构建镜像涉及的相关命令,如FROM,RUN,COPY,ADD等等。每个命令都有不同的使用规则

规范
解析器命令构建器命令 不区分大小写。但是按照惯例,解析器命令一般使用小写,构建器命令 使用大写。

简单应用

home目录下,创建一个dockerimage 目录,在/home/dockerimage目录里使用 vim编辑器创建一个Dockerfile文件,输入如下命令,然后保存文件。

FROM centos:centos7.9.2009
RUN echo `Hello World`

然后键入生成docker镜像的命令

docker build -t dockerfile-test:v1.0 -f /home/dockerimage/Dockerfile .

Dockerfile 构建指令

FROM 初始化一个新的构建阶段,并为后续指令设置基本镜像。因此,一个有效的Dockerfile必须以FROM指令开始。一个Dockerfile文件中可以有多个构建阶段,即可以存在多个FROM

RUN 指令将在当前镜像上方的新层中执行任何命令,并提交结果。生成的提交镜像将用于Dockerfile中的下一步。注意:每一次RUN的执行都会创建一个新的镜像层,所以可以合并多个RUN命令为一条,用&&连接。例如:

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo  \
    && rm -rf /var/lib/apt/lists/*

docker build 构建镜像命令

-t 指定 REPOSITORY(存储库)和TAG(标记),可以键入docker images 命令查看已经下载的dockerimage,-t代表的就是REPOSITORYTAG,可以理解为镜像唯一性用存储库:版本号这种方式表达。我们创建的镜像可以有多个存储仓库,即可以使用多次-t来保存我们的镜像,例如:-t dockerfile- test:v1.0 -t testdockerfile:v2.0 -t mydocker/test:v1.0

-f 指定Dockerfile文件位置,如果在Dockerfile文件目录执行docker build命令,可以省略 -f 指令

. 构建的上下文指定位置PATH或URL上的一组文件,PATH是本地文件系统上的一个目录,URL是一个Git存储库位置。一般 . 所代表的就是指当前目录,使用docker build命令会将当前目录打包发送给 docker守护进程进行构建,注意:目录是递归形式的,所以不要在 根目录 / 构建上下文,这样会递归所有硬盘内容。

  • 为什么会有上下文,指的是什么意思?
    因为构建镜像是在服务端进行,我们本地仅仅只是传入一个构建命令而已,当我们要构建一个应用程序和其相关环境的时候,这个应用程序及其相关环境如何让服务端知道?我们需要将内容(资源)打包到服务端,然后由服务端解压并构建环境,这就是上下文的用途。即 Dockerfile文件是写入构建逻辑和相应的步骤,构建中涉及的相关资源由上下文来提供,比如Dockerfile文件中的ADDCOPY命令,它所指定的源路径 就是上下文的路径,而目标路径指的就是镜像中的路径了。