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 specifiedPATH
orURL
. The build process can refer to any of the files in the context. For example, your build can use aCOPY
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 中这么写:
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