Docker构建上下文

2018-02-15  本文已影响1295人  0过把火0

转载注明出处[ https://www.jianshu.com/p/5f79b573c2fb ]

很多新手对于编译镜像时所输入命令中的 . 表示很疑惑,其实这个是在编译时构建docker上下文路径。

什么是上下文?

首先需要理解build命令的工作原理。

Docker是cs架构,也就是docker在运行时分为服务端(docker引擎)和客户端。用户在客户端所输入的一系列以docker开头的命令都是在通过一组RestAPI在远程与docker引擎交互。因此,虽然看起来我们是在本地直接操作docker,但是其实质是在远程调用并执行。基于这样的设计,我们很轻松地操作远端服务器上的Docker引擎。

dockerfile中经常会有ADD或是COPY这样拷贝文件的指令。而build的过程中,服务端的docker引擎需要知道你本地文件的路径,因此引入了上下文概念。

当在build命令中指定了编译路径时,那么docker引擎会将该路径下的所有文件打包,然后上传至docker引擎,此时,docker服务端就收到了这个上下文的路径内容,对其展开便能够看到所有该路径下的文件。

COPY ./test.txt /etc/
COPY test.txt /etc/

上面的写法表达同样的意思,就是复制上下文目录中的test.txt文件到镜像下的etc目录中。

因此,COPY这类指令中的源文件的路径都是相对路径。这也是初学者经常会问的为什么 COPY ..test.txt /etc/或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到上下文目录中去。

注意事项

有人可能会觉得上下文路径就是Dockerfile所在的路径,并非如此。
默认情况下建议将Dockerfile和所需的各种文件以及包放在同一个目录下,理所当然此时所构建的上下文路径就是指Dockerfile所在的路径。但是并不是一定要这样做,-f 参数可以指定Dockerfile的所在路径以及名字,但是大多时候都是使用默认的名字即可。

使用时注意,不要将Dockerfile置于根目录下进行编译,你会发现整个镜像会将你的磁盘进行打包!!!
最佳实践是建一个空目录,创建Dockerfile,并将你要用的文件和所有包置于该目录下。

上一篇下一篇

猜你喜欢

热点阅读