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

fro*_*r78 33 build docker dockerfile

Docker构建上下文的目的是什么?我从文档中了解到,它是将整个内容发送到docker守护程序的"入口"点.但是,假设在示例中提供的默认用例,当我们还必须在Dockerfile中显式包含COPY或ADD指令时,以及在生成的图像中包含当前目录的内容时,发送当前目录的全部内容的重点是什么? ?如果将上下文发送到守护程序以包含在映像中,那么为什么我们需要执行此额外步骤.为什么压缩的上传/发送/复制任务默认不包含指定目录的内容?

例如,给定这个目录结构

-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
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,docker build -t user/myproject:2.3.

然后我希望在生成的图像中的某处看到myproject目录.但是,我必须包括

 ADD myproject /
Run Code Online (Sandbox Code Playgroud)

因为那是事实.

如果构建过程压缩当前目录内容并将其发送到守护程序,那么它在哪里?为什么不将该内容用于图像?

Rob*_*ert 26

TL; DR:"因为客户端和守护进程甚至可能无法在同一台机器上运行"

docker命令是Docker客户端,该dockerd服务可以直接在您的PC(Linux)或OSX或Windows下的Linux VM下运行.

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

这里:

也许会提到这必须以这种方式发生,因为客户端和守护进程甚至可能不在同一台机器上运行,因此如果没有这个"上下文",守护进程机器将没有任何其他方式来获取ADD文件或除此以外


问:如果构建过程压缩当前目录内容并将其发送到守护程序,那么它在哪里?

docker守护程序接收压缩目录并动态处理它; 在那个时刻存储在哪里并不重要.

问:为什么不将该内容用于图像?

想一想:docker如何知道希望将每个文件/目录放在目标映像中的哪个位置?使用COPY/ADD指令,您可以控制每个指令的位置.你提到的情况只是一个简单的例子,你只有目录和目标.

  • "因为客户端和守护进程可能甚至不能在同一台机器上运行",即使情况并非如此,这似乎是一个不好的理由,尤其是在AIUI之后,它们大部分时间都在同一台机器上.Docker也可以只根据`COPY`命令发送文件. (6认同)
  • 为什么 docker build 命令不能首先通过 Dockerfile 并确定添加了哪些内容并将其(并且仅是)添加到上下文中? (3认同)