Docker在上下文之外遵循符号链接


88

另一个Docker符号链接问题。我有一堆文件要复制到我的所有Docker构建中。我的目录结构是:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

在上面的示例中,当我在dir1中进行docker构建时,我希望将file.txt复制过来。但是我不想维护file.txt的多个副本。每此链接,作为搬运工版本0.10,码头工人的作品必须

按照容器根目录内的符号链接获取ADD构建说明。

但是当我在Dockerfile中使用以下任一行进行构建时,我没有得到这样的文件或目录

ADD symlink /path/dirname 要么 ADD symlink/file.txt /path/file.txt

安装选项不会为我解决(跨平台...)。我尝试tar -czh . | docker build -t没有成功。

有没有一种方法可以使Docker遵循符号链接并将common_files / file.txt复制到已构建的容器中?

Answers:


68

那是不可能的,将不会实现。请看一下关于github问题#1676讨论

我们不允许这样做,因为它不可重复。您机器上的符号链接与我的机器不同,相同的Dockerfile会产生两个不同的结果。同时具有指向/ etc / paasswd的符号链接也会引起问题,因为它会链接主机文件而不是本地文件。


谢谢。是的,我之前注意到该链接,但我认为这是针对较旧版本的Docker(0.6.1)的。0.10的更改日志提及这可能是github.com/docker/docker/blob/master/…–
Ravi

同样,如果在任何计算机上检出了“ parent_dir”,并且符号链接具有“ common_files”的相对路径,则该路径是可重复的。
拉维

2
您的报价Follow symlinks inside container's root for ADD build instructions.表示在容器内部遵循符号链接。不在构建上下文目录中。在ADD file.txt /dir/file.txt目录中dir可能是一个符号链接。我在答案中引用的参数仍然有效,最新版本中仍未遵循符号链接。将符号链接存储在版本控制系统(如git)中时,可能会遇到问题(关于可重复性)。因此请参考这个问题
2015年

1
我了解您对git中的符号链接的观点。但是符号链接不必一定要加入git。一个简单的安装脚本可以准备本地环境创建符号链接。对我而言,从维护角度来看,保留“ n”个共享文件副本的成本似乎太高了。也许我需要用Apache来代替它。谢谢。
拉维2015年

18
真可惜,虽然我明白我的观点,但我不遵循逻辑,这使我很伤心。Git可以完美地处理symblinks,我也希望构建能够在所有签出源回购的机器和环境中正常工作。
格雷戈尔

9

一种可能性是使用以下命令在父目录中运行构建:

$ docker build [tags...] -f dir1/Dockerfile .

(或等效地,在子目录中)

$ docker build  [tags...] -f Dockerfile ..

必须将Dockerfile配置为使用适当的路径进行复制/添加。根据您的设置,您可能希望.dockerignore父项中的内容不包含不想放入上下文中的内容。



2

代替使用simlink,可以通过仅将文件从sites_available移到sites_enabled而不是复制或创建simlink的方法来解决管理问题。

因此,如果您的网站配置停止了,它只会在site_available文件夹中以一个副本存在;如果应该使用某个网站,则它将在sites_enabled中以一个副本存在


1

我知道这破坏了docker build的可移植性,但是您可以使用硬链接代替符号链接:

ln /some/file ./hardlink

3
需要明确的是,这适用于文件而不是目录。
GDorn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.