转载注明出处[ 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,并将你要用的文件和所有包置于该目录下。
网友评论