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

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

我有两个需要 dockerize 的 Dart 应用程序。这两个应用程序使用共享源目录。
由于 Docker 阻止从上下文目录 ( project/app1) 之外的文件夹添加文件,因此我无法../sharedshared( 内的符号链接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 不太熟悉,还没有尝试过,只是搜索了一下)。

还有其他工具或技巧可以实现这一点吗?

我宁愿不改变目录结构,因为这会导致其他麻烦,也不愿复制文件。

答案1

我没有太多经验,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

此次调用后,相同的内容可在两个地方访问。

答案2

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

所以你必须想出一个不同的方法。如果你看看这个问题:添加对参数 #6094 中符号链接的支持,我们 U&L 的朋友(@帕特里克又名 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

我非常沮丧,于是我制作了一个小型 NodeJS 实用程序来帮助解决这个问题:文件同步器

基本用法:

// starts live-sync of files under "common_files" to "my-app/HardLinked/common_files"
npx file-syncer --from common_files --to my-app/HardLinked

更多信息这个 Stackoverflow 答案,以及Github 仓库

相关内容