描述
通过读取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
代表的就是REPOSITORY
和TAG
,可以理解为镜像唯一性用存储库:版本号
这种方式表达。我们创建的镜像可以有多个存储仓库,即可以使用多次-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
文件中的ADD
和COPY
命令,它所指定的源路径
就是上下文
的路径,而目标路径
指的就是镜像中的路径了。