## Docker Build 命令中的参数
在使用 docker build 命令构建 docker 镜像时, 一般会用到下面这样的命令:
```docker
docker build -t imagename:tagname .
```
当然 build 命令还有其他的参数, 比如用 `-f` 指定dockerfile 文件等( [文档地址](https://docs.docker.com/engine/reference/commandline/build/))但简单的镜像主要是指定镜像名称标签就可以了, 而 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 监听

执行 docker build 命令, 第一步就是把构建上下文的内容上传到 daemon , 然后剩下的构建操作都在 daemon 中执行
在 build 命令打出的日志中, 第一行执行的就是这个步骤
```
Sending build context to Docker daemon 55.09MB
```
这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。如果在 Dockerfile 中这么写:
```docker
COPY ./package.json /app/
```
这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json,而是复制 **上下文(context)** 目录下的 package.json
参考地址:
* https://www.cnblogs.com/CloudMan6/p/6763789.html
* https://yeasy.gitbooks.io/docker_practice/content/image/build.html#%E4%BB%8E%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E4%B8%AD%E8%AF%BB%E5%8F%96%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8E%8B%E7%BC%A9%E5%8C%85%E8%BF%9B%E8%A1%8C%E6%9E%84%E5%BB%BA
*

Docker中的构建上下文