如何在Docker文件中使用“ADD”命令包含Docker构建上下文之外的文件?
从Docker文档中:
路径必须位于生成的上下文中;您不能添加../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。
我不想重组我的整个项目,只是为了在这件事上适应Docker。我想将所有Docker文件保存在同一个子目录中。
此外,Docker似乎还不支持符号链接:Dockerfile ADD命令不支持主机#1676上的符号链接。
我唯一能想到的另一件事是包含一个预构建步骤,将文件复制到Docker构建上下文中(并配置我的版本控制以忽略这些文件)。还有比这更好的解决方法吗?
我花了很长时间试图找出一个好的模式,以及如何更好地解释这个特性支持的情况。我意识到最好的解释方法如下。。。
Dockerfile:将只看到其自身相对路径下的文件上下文:“空间”中的一个位置,您要共享的文件和Dockerfile将被复制到该位置
因此,尽管如此,这里有一个Dockerfile的示例,它需要重用一个名为start.sh的文件
Dockerfile文件
它将始终从其相对路径加载,将其当前目录作为指定路径的本地引用。
COPY start.sh /runtime/start.sh
文件夹
考虑到这个想法,我们可以考虑为Dockerfile创建多个副本来构建特定的东西,但它们都需要访问start.sh。
./all-services/
/start.sh
/service-X/Dockerfile
/service-Y/Dockerfile
/service-Z/Dockerfile
./docker-compose.yaml
考虑到这个结构和上面的文件,这里有一个docker-compose.yml
码头组合.yaml
在本例中,共享上下文目录是运行时目录。这里的思维模式是一样的,认为这个目录下的所有文件都被移到了所谓的上下文中。同样,只需指定要复制到同一目录的Dockerfile。可以使用dockerfile指定。主要内容所在的目录是要设置的实际上下文。
docker-compose.yml如下
version: "3.3"
services:
service-A
build:
context: ./all-service
dockerfile: ./service-A/Dockerfile
service-B
build:
context: ./all-service
dockerfile: ./service-B/Dockerfile
service-C
build:
context: ./all-service
dockerfile: ./service-C/Dockerfile
所有服务都被设置为上下文,共享文件start.sh以及每个Dockerfile指定的Dockerfile都被复制到那里。每个人都可以按照自己的方式构建,共享开始文件!
如果您阅读第2745期中的讨论,不仅docker可能永远不支持符号链接,他们也可能永远不会支持在您的上下文之外添加文件。这似乎是一种设计理念,即进入docker构建的文件应该明确地成为其上下文的一部分,或者来自一个URL,在该URL中,它可能也会以固定版本部署,这样构建就可以用docker容器附带的公知URL或文件重复。
我更喜欢从版本控制的源代码构建,即docker构建-t东西http://my.git.org/repo-否则我会在随机的地方用随机文件进行构建。从根本上说,不是……——斯文·多维迪特,多克公司
只是我的看法,但我认为您应该进行重组,以分离代码和docker存储库。这样,容器可以是通用的,并在运行时而不是构建时引入任何版本的代码。
或者,使用docker作为基本的代码部署工件,然后将dockerfile放在代码存储库的根目录中。如果您这样做,那么使用父docker容器获取更一般的系统级详细信息和子容器获取特定于您的代码的设置可能是有意义的。