另一个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/dirname
或
ADD symlink/file.txt /path/file.txt
mount选项不会为我解决(跨平台...)。
我试了tar -czh . | docker build -t
没有成功。
有没有办法让Docker遵循符号链接并将common_files / file.txt复制到构建的容器中?
答案 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。这样做的好处是,如果您有许多依赖图像,那么由于使用了一个公共层,它们都会更小一些。