如何使符号链接的文件夹显示为普通文件夹


38

我有两个需要进行docker化的Dart应用程序。这两个应用程序使用共享的源目录。
由于Docker阻止从上下文目录(project/app1)之外的文件夹中添加文件,因此我不能从../shared或从shared(中的符号链接projects/app1)添加文件。

我正在寻找一种欺骗Docker的方法。

我简化的项目结构

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

我可以向上移动Dockerfile一个级别并docker build从那里运行,但是然后我需要在同一目录中两个Dockerfile(用于app1和app2)。

我当前的想法是,如果我能以某种方式掩盖projects/app1/shared符号链接这一事实,那么这个问题将得到解决。我检查了是否可以共享projects使用Samba并将其重新安装到其他位置,并将Samba配置为将符号链接视为普通文件夹,但尚未找到是否支持此功能(我对Samba经验不足,也没有尝试过,只是搜索了一下) 。

还有其他工具或技巧可以允许吗?

我宁愿不更改目录结构,因为这会引起其他麻烦,并且也不愿复制文件。

Answers:


35

我没有太多经验,docker所以我不能保证这会起作用,但是一种选择是挂载目录而不是链接到该目录:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

这将附加../shared./shared系统上,并且对于系统应该是完全透明的。如中所述man mount

绑定安装。

从Linux 2.4.0开始,可以在其他位置重新安装文件层次结构的一部分。电话是:

mount --bind olddir newdir

或使用以下fstab条目:

/olddir /newdir none bind

调用之后,可以在两个位置访问相同的内容。


1
@zoechi这是两个站点上的主题。通常,我会在U&L上发布更多类似这样的技术问题,并在此处发布更多用户空间问题。不过,选择完全取决于您。一方面,这里有更多的用户,所以更多的眼球,另一方面,U&L上的专业* nix人员的集中度更高。只要确保您不在两个站点上都发布相同的问题即可。如果要移动它,请删除此标志或标记以引起Mod注意,并要求他们迁移。
2014年

2
我必须重新启动docker daemon!否则,安装的目录在容器中不可见。
暗淡

@dim是的!我试图使其与Capistrano一起使用,但没有成功–事实证明,我启动容器挂载了共享目录
csch

不幸的是,这不适用于Windows或OS X用户。关于这个问题的辩论一直很活跃。
杰森

正在将“提交”安装到源代码控制,例如github?还是我每次都要做?
pie6k

23

这个问题在Docker社区中屡屡出现。Dockerfile如果您运行它或我运行它,它基本上违反了可重复性的要求。因此,我不会期望这种能力,如此票证中所述:Dockerfile ADD命令不遵循主机#1676上的符号链接

因此,您必须考虑另一种方法。如果您看这个问题:在参数#6094中添加以支持符号链接, U&L的朋友(@Patrick aka。phemmer)提供了一个聪明的解决方法。

$ tar -czh . | docker build -

这告诉tar您从当前目录中取消引用符号链接,然后将它们全部通过管道传递给docker build -命令。

tar手册页摘录
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
这是一个出色的解决方案!我了解为什么Docker声称他们想忽略此功能。但是,在开发容器化项目时使用的工作流与我期望如何为生产而构建的工作流之间存在很大差异。在我的本地计算机上,我想要一个超级紧密的反馈循环。我的应用程序有1个git repo,而容器的构建环境有2nd个repo。在确定是否要提交和推送之前,我需要能够在本地进行编辑和构建测试。我的最终项目中没有符号链接或添加说明。
Bruno Bronosky

6
Dockerfile是不可重复的。Dockerfile不可能具有可重复性,因为它们几乎都在第二层或第三层具有apt-get或等同功能,并且apt-get不可重复。将Docker开发策略捆绑到试图使不可能变为现实的错误尝试中,只会使Docker陷入一系列糟糕的抽象,使任何人都无济于事。 nathanleclaire.com/blog/2014/09/29/…–
杰森

1
好的,所以我真的不明白为什么这比cp命令更好,您能解释一下为什么更好吗?我还认为管道令人困惑/过于混乱。为什么不把tar命令放在build命令之上呢?我猜是因为这样您将用真实目录覆盖符号链接目录。
亚历山大·米尔斯

1
@AlexanderMills-看看会发生什么的最好方法是尝试一下,看看有什么不同。另外,上面是集装箱的建筑,没有运行,因此没有安装。stackoverflow.com/questions/37328370/…。我强烈建议您尝试所有这些事情,这将更加有意义。
slm

1
我刚刚添加/bin/cp ../requirements.txt . && docker build ...了一个用于构建Docker的Makefile,它更加简单
user5359531'1
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.