如何在Docker的构build上下文之外包含文件?

如何使用Docker文件中的“ADD”命令来包含Docker构build上下文之外的文件?

从Docker文档:

path必须在构build的上下文中; 你不能添加../something/something,因为docker build的第一步是把上下文目录(和子目录)发送到docker守护进程。

在这个问题上,我不想重组我的整个项目只是为了适应Docker。 我想保留所有的Docker文件在同一个子目录下。

此外,Docker还没有(也可能不曾)支持符号链接: Dockerfile ADD命令不遵循主机#1676上的符号链接。

我唯一能想到的其他事情是包含预构build步骤,将文件复制到Docker构build上下文(并将我的版本控制configuration为忽略这些文件)。

有没有任何已知的清理解决方法? 一定会有更好的办法。

谢谢

解决这个问题的最好方法是使用-f指定独立于构build上下文的Dockerfile。

例如,这个命令将给ADD命令访问当前目录中的任何东西。

docker build -f docker-files/Dockerfile . 

在Linux上,您可以挂载其他目录而不是将它们混合

 mount --bind olddir newdir 

有关更多详细信息,请参阅https://superuser.com/questions/842642

我不知道是否有类似的东西可用于其他操作系统。 我也尝试使用Samba来共享一个文件夹,并将其重新安装到Docker上下文中。

如果您阅读第2745期中的讨论,不仅Docker可能永远不支持符号链接,他们可能永远不会支持在您的上下文之外添加文件。 似乎是一种devise理念,即进入docker构build的文件应该明确地成为其上下文的一部分,或者来自一个URL,在这个URL中,它也可能被固定版本部署,以便构build可以通过已知的URL或随docker集装箱。

我更喜欢从版本控制的源码 – 即docker构build-t东西http://my.git.org/repo – 否则我从一些随机的随机文件build设。

从根本上说,没有… – SvenDowideit,Docker Inc

只是我的意见,但我认为你应该重组,以分离出代码和docker库。 这样,容器可以是通用的,并且在运行时可以使用任何版本的代码,而不是编译时间。

或者,使用docker作为您的基本代码部署工件,然后将dockerfile放入代码库的根目录中。 如果你走这条路线可能是有道理的有一个父泊坞窗容器为更一般的系统级别的详细信息和一个子容器的设置特定于您的代码。

我相信更简单的解决方法是更改​​“上下文”本身。

所以,例如,而不是给:

 docker build -t hello-demo-app . 

它将当前目录设置为上下文,假设您想将父目录作为上下文,请使用:

 docker build -t hello-demo-app .. 

您还可以创build一个图像需要的tarball,并将其用作上下文。

https://docs.docker.com/engine/reference/commandline/build/#/tarball-contexts