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

zoe*_*chi 54 linux filesystems symbolic-link shared-folders docker

我有两个需要 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
Run Code Online (Sandbox Code Playgroud)

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

我目前的想法是,如果我能以某种方式隐藏projects/app1/shared作为符号链接的事实,这个问题就会得到解决。我检查了是否可以projects使用 Samba进行共享并将其重新安装到其他地方,并将 Samba 配置为将符号链接视为普通文件夹,但还没有找到是否支持(我对 Samba 没有太多经验,还没有尝试过,只是搜索了一下) .

有没有其他工具或技巧可以做到这一点?

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

ter*_*don 44

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

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/
Run Code Online (Sandbox Code Playgroud)

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

绑定安装。

从 Linux 2.4.0 开始,可以在其他地方重新挂载文件层次结构的一部分。电话是:

mount --bind olddir newdir
Run Code Online (Sandbox Code Playgroud)

或使用此 fstab 条目:

/olddir /newdir none bind
Run Code Online (Sandbox Code Playgroud)

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

  • 我必须重新启动 docker 守护进程!否则安装的目录在容器中不可见。 (2认同)

slm*_*slm 43

这个问题在 Docker 社区中反复出现。它基本上违反了Dockerfile如果你运行它或者我运行它是可重复的要求。所以我不希望有这种能力,如这张票中所述:Dockerfile ADD 命令不遵循主机 #1676 上的符号链接

所以你必须想出一个不同的方法。如果您查看此问题:在参数 #6094 中添加支持符号链接,我们来自 U&L 的朋友(@Patrick aka. phemmer)提供了一个巧妙的解决方法。

$ tar -czh . | docker build -
Run Code Online (Sandbox Code Playgroud)

这告诉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
Run Code Online (Sandbox Code Playgroud)

  • Dockerfile 不可重复。Dockerfiles 不可能是可重复的,因为它们几乎都有 apt-get 或第二层或第三层的等价物,而 apt-get 是不可重复的。将 Docker 开发策略与错误的尝试联系在一起,将不可能变为现实只会让 Docker 背上一系列对任何人都没有帮助的糟糕抽象。https://nathanleclaire.com/blog/2014/09/29/the-dockerfile-is-not-the-source-of-truth-for-your-image/ (16认同)
  • 这是一个很好的解决方案!我理解为什么 Docker 声称他们想要省略这个功能。但是,我在开发容器化项目时使用的工作流程以及我期望它为生产构建的方式存在很大差异。在我的本地机器上,我想要一个超级紧密的反馈循环。我的应用程序有 1 个 git 存储库,容器的构建环境有第二个存储库。我需要能够在本地进行编辑和构建测试,然后才能决定是否要提交和推送。我的最终项目中不会有符号链接或 ADD 指令。 (8认同)
  • 对于新手,你能用英语解释一下这里发生了什么吗?链接到 tar 手册页很好,但是 (2认同)