Docker中的构建上下文

Docker Build 命令中的参数

在使用 docker build 命令构建 docker 镜像时, 一般会用到下面这样的命令:

docker build -t imagename:tagname .

当然 build 命令还有其他的参数, 比如用 -f 指定dockerfile 文件等( 文档地址)但简单的镜像主要是指定镜像名称标签就可以了, 而 docker 客户端会按照约定自动查找当前目录下名称为 Dockerfile 的文件进行构建。 所以很多人认为 build 命令的最后面这个 . 就是表示“使用当前路径下的Dockerfile 文件进行构建”的意思。

但是我们稍微想一下也知道这是不合理的: 既然能够通过 -f 表示 Dockerfile 文件地址, 那再在后面添加一个参数指定地址不就冲突了么? 其实如果仔细看一下文档就知道, 这里的最后面的参数表示的是一个 "context" , 这个 context 我们称之为 ”构建上下文“

The docker build command builds Docker images from a Dockerfile and a “context”. A build’s context is the set of files located in the specified PATH or URL. The build process can refer to any of the files in the context. For example, your build can use a COPY instruction to reference a file in the context.

文档说到: docker build 命令通过 Dockerfile 文件和一个“上下文”进行构建镜像, 这个“上下文” 是指最后一个参数(可以是一个路径或 URL )所指定的文件, 即该路径下所有的文件和文件夹

另外第二句: build 进程能够引用上下文中的任何文件, 比如, Dockerfile 中的 COPY 指令可以引用上下文中的文件, 言外之意是: ”不是上下文中的文件是不能引用到的“

为什么会有构建上下文

我们知道, docker 是一种 c/s 架构, 客户端是我们输入 docker 命令的地方,而服务端,也就是 dockerd daemon , 这是 docker 架构的主要部分, 以 Linux 后台服务的方式运行。daemon 可以安装在与 client 同一服务器, 也可以在其他服务器上, 负责管理其所在宿主机上的各个容器。 默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听

d449ed28gy1g2o979xi30j210u0iiad5

执行 docker build 命令, 第一步就是把构建上下文的内容上传到 daemon , 然后剩下的构建操作都在 daemon 中执行 在 build 命令打出的日志中, 第一行执行的就是这个步骤

Sending build context to Docker daemon  55.09MB

这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。如果在 Dockerfile 中这么写:

COPY ./package.json /app/

这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json,而是复制 上下文(context) 目录下的 package.json

参考地址: