Docker构建上下文的目的是什么?

What is the purpose of the Docker build context?

Docker构建上下文的目的是什么?我从文档中了解到,这是将整个内容发送到docker守护进程的"入口"。但是,假设示例中提供了默认用例,那么发送当前目录的全部内容有什么意义呢?当我们还必须在dockerfile中显式地包含copy或add指令,以便在生成的映像中实际包含当前目录的内容时?如果将上下文发送到要包含在映像中的守护进程,那么为什么需要执行这个额外的步骤。为什么压缩上传/发送/复制任务在默认情况下不包括指定目录的内容?

例如,给定此目录结构

1
2
3
-rw-r--r--  1 me me    7 Jun  8 18:52 .dockerignore
-rw-r--r--  1 me me 1.1K Jun  9 12:42 Dockerfile
drwxr-xr-x 13 me me 4.0K Jun  8 19:43 myproject

当我运行这个命令时docker build-t用户/myproject:2.3。

然后我希望在生成的映像中的某个地方看到一个myproject目录。但是,我必须包括

1
 ADD myproject /

事实就是这样。

如果构建过程压缩当前目录内容并将其发送到守护进程,那么它将在哪里进行?为什么它不能使图像中的内容可用?


tl;dr:"因为客户机和守护进程甚至不能在同一台计算机上运行"

docker命令是dockerd的Docker客户机,该服务可以直接在您的PC(Linux)或Linux虚拟机上在OSX或Windows下运行。

Q: What is the purpose of the Docker build context?

从这里:

Would probably be good to also mention that this has to happen this way because the client and daemon may not even run on the same machine, so without this"context" the daemon machine wouldn't have any other way to get files for ADD or otherwise

Q: If the build process compresses the current directory contents and sends it to the daemon, where does it go?

Docker守护进程接收压缩的目录并动态地处理它;这与它存储在那个时刻的位置无关。

Q: Why doesn't it make that content available for use in the image?

这样想:Docker如何知道您要将每个文件/目录放在目标映像中的什么位置?使用COPY/ADD指令,您可以控制每个指令的放置位置。您提到的情况只是一个小例子,其中您只有目录和目标。