我有两个需要 dockerize 的 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 不太熟悉,还没有尝试过,只是搜索了一下)。
还有其他工具或技巧可以实现这一点吗?
我宁愿不改变目录结构,因为这会导致其他麻烦,也不愿复制文件。
答案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 -
。
-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 仓库。