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

时间:2015-08-07 15:51:40

标签: docker symlink dockerfile symlink-traversal

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

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

在上面的例子中,我想在我在dir1内构建docker时复制file.txt。但我不想保留file.txt的多个副本。 每this link, as of docker version 0.10,docker build必须

  

按照容器根目录中的符号链接添加ADD构建说明。

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

ADD symlink /path/dirnameADD symlink/file.txt /path/file.txt

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

有没有办法让Docker遵循符号链接并将common_files / file.txt复制到构建的容器中?

7 个答案:

答案 0 :(得分:46)

这是不可能的,也不会实施。请查看discussion on github issue #1676

  

我们不允许这样做,因为它不可重复。机器上的符号链接与我的机器不同,相同的Dockerfile会产生两种不同的结果。对/ etc / paasswd添加符号链接会导致问题,因为它会链接主机文件而不是本地文件。

答案 1 :(得分:6)

如果有人仍然有此问题,我在superuser.com上找到了一个很好的解决方案:

https://superuser.com/questions/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

它基本上建议使用tar取消引用符号链接并将结果馈入docker build:

$ tar -czh . | docker build -

答案 2 :(得分:4)

对于遇到此问题的其他人,请see this link。 我个人选择了#34;建立一个共同的基本形象"解决方案,它的工作非常出色。

答案 3 :(得分:2)

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

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

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

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

必须将Dockerfile配置为使用适当的路径进行复制/添加。根据您的设置,您可能希望父母中的.dockerignore遗漏 不想放在上下文中的东西。

答案 4 :(得分:2)

除了使用simlink之外,还可以通过仅将文件从sites_available移到sites_enabled而不是复制或创建simlink的方法来解决管理上的问题

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

答案 5 :(得分:1)

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

ln /some/file ./hardlink

答案 6 :(得分:1)

我只需要在相同的上下文中解决这个问题。我的解决方案是使用分层 Docker 构建。换句话说:

parent_dir
  - common_files
    - Dockerfile
    - file.txt

- dir1
    - Dockerfile (FROM common_files:latest)

缺点是要记住在dir1之前构建common_files。这样做的好处是,如果您有许多依赖图像,那么由于使用了一个公共层,它们都会更小一些。