Xav*_*ero 4 windows filesystems symlink samba docker
如何从 Windows 主机查看 docker linux-containers 的符号链接?(即使我必须放置一台中间 Linux 机器通过 NFS 或 Samba 公开文件系统)
在 DEVEL 环境中,我在办公室 Linux 的某个远程文件系统中具有以下结构:
/files/repos/app-1
/files/repos/app-2
/files/repos/lib-x
/files/repos/lib-y
Run Code Online (Sandbox Code Playgroud)
两者app-1并app-2使用那些供应和符号链接的库,如下所示:
/files/repos/app-1/vendor/my-company/lib-x => /files/repos/lib-x
/files/repos/app-1/vendor/my-company/lib-y => /files/repos/lib-y
/files/repos/app-2/vendor/my-company/lib-x => /files/repos/lib-x
/files/repos/app-2/vendor/my-company/lib-y => /files/repos/lib-y
Run Code Online (Sandbox Code Playgroud)
开发人员需要使用 Windows。
因此,开发人员让他们的 IDE 指向某个已安装的单元,例如 Z:\,他们可以在其中看到所有存储库和项目。
这使我们能够:
lib-x和lib-y.app-1)的“完整结构”,还可以看到 的类,lib-x因此lib-y自动完成功能可以完美地工作。这种方式已经运行了近十年,而且效果非常好。
开发人员需要连接到服务器来进行开发,我们希望转变为本地 Docker,这样我们就可以让开发人员在家工作。
我们现在决定不再使用办公服务器,我们将在 docker 容器中设置所有开发。
我们刚刚在 Windows 中安装了 docker 桌面,并将 C:\repos 从主机共享到 docker。
我们现在有一些开发机器FROM ubuntu:xxx并运行它们来安装卷。
我们在Linux 容器内部和往来之间app-1建立app-2了lib-x符号链接。lib-y
如果我们在本地 Docker 中运行应用程序,这确实可以完美工作,并且存储库也可以正常工作
现在的问题是 IDE:当它读取 C:\repos\app-1 中的文件时,无法从主机看到在 Linux 容器中创建的符号链接。
这使得 IDE 无法遵循 C:\repos\app-1\vendor\lib-x 并且所有代码完成帮助程序都被破坏。
我已经知道 Windows 不支持与 Linux 符号链接兼容的符号链接。
这迫使我们寻找替代解决方案。
最初我认为,在旧的拓扑中,Linux 服务器只是通过 samba 共享文件系统,而 Windows 只能读取符号链接内容,因为它们在服务器端而不是客户端解映射,我认为我可以运行另一台 docker 机器使用 samba 服务器只是为了将“从 linux 看到的东西”本地再次共享到 Windows 主机。
为此,我设置了这个 docker-compose:
version: "3.7"
services:
samba:
container_name: samba
hostname: samba
image: dperson/samba
volumes:
- //c/Users/xavi/Documents/repos/test_samba:/mount
ports:
- "139:139"
- "445:445"
command: samba.sh -s "test_samba;/mnt/repos/test_samba;yes;no;yes;all"
restart: always
Run Code Online (Sandbox Code Playgroud)
但这是冲突的,因为 445 已在本地使用。
如果我关闭本地 SMB,那么在下次重新启动时,docker 无法将 C:\ 共享到 docker(我没有意识到它通过 SMB 进行共享,可以将其转换为 NFS 等吗?)
如果我映射到另一个端口,例如 10445:445,那么客户端将无法访问它,因为 Windows 中的客户端 samba 端口似乎不可配置。
所以我尝试映射一个IP:
version: "3.7"
services:
samba:
container_name: samba
hostname: samba
image: dperson/samba
volumes:
- //c/Users/xavi/Documents/repos/test_samba:/mount
ports:
- "139:139"
- "192.168.4.83:445:445"
command: samba.sh -s "test_samba;/mnt/repos/test_samba;yes;no;yes;all"
restart: always
networks:
samba:
ipv4_address: 192.168.4.83
networks:
samba:
ipam:
driver: default
config:
- subnet: "192.168.4.0/16"
Run Code Online (Sandbox Code Playgroud)
但这似乎仍然会产生问题:
我怎样才能让 Windows 主机看到“符号链接的解映射内容”,以使 IDE 看到从 docker linux 容器内部链接的供应内容?
export MSYS=winsymlinks:nativestrictgit-bash 中的问题。ln -s在 Windows 中工作。我们将逐步完成以下步骤:
abc目录中的一些文件。xyz指出abc.ubuntu并更改xyz.abc我们还将在 docker 中看到更改。abc。xyz/c并创建一个临时目录tmp。abc目录并在其中放入一些内容。cd /c
mkdir tmp
cd tmp/
mkdir abc
cd abc/
echo 1111 > old_1
echo 2222 > old_2
echo 3333 > old_3
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
首先让我们尝试“正常”方式,看看它是否失败。
/c/tmpxyz指向abc:ln -s abc xyztmp并且看到它xyz是一个常规目录。xyz并查看它是否在 中abc。尝试创建链接。它不会成为符号链接,而是创建目录的副本。
cd /c/tmp/
ln -s abc xyz
Run Code Online (Sandbox Code Playgroud)
new_bad在中创建xyz,但在 中看不到abc它。
cd xyz/
touch new_bad
cd ../abc/
ls -l
Run Code Online (Sandbox Code Playgroud)
清除错误xyz
rm -Rf xyz/
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
真正的东西来了。灵感来自@Slayvin在这里的回答,以及这里Git Bash shell无法创建符号链接和这里的官方git-for-windows存储库https://github.com/git-for-windows/git/pull/156
export MSYS=winsymlinks:nativestrict
Run Code Online (Sandbox Code Playgroud)
这将告诉 git-bash 的运行时子系统实际使用符号链接功能。因为我们是管理员,所以我们会成功。
ln -s abc xyz有用!!!现在下一步是在 docker 中进行测试!
注意:根据 Sebastian 的回答/sf/answers/2863999421/如果您启用了开发人员工具,您不需要成为管理员即可在 git-bash 中创建符号链接。在搜索栏中写入for developers并启用它:
-it与 ubuntu 的 bash 交互。用于winpty允许-it工作。/c/tmp目录,以便abc和xyz都可访问。我选择将其安装到/files.cd /files看,这xyz实际上是一个符号链接。xyz运行看看:
winpty docker run -it --rm --mount type=bind,source="c:\tmp",target=/files --name ubuntu-link ubuntu
cd /files/
ls -l
Run Code Online (Sandbox Code Playgroud)
创建内容:
cd xyz
echo "yeaaahh" > new_good
Run Code Online (Sandbox Code Playgroud)
检查它确实是一个符号链接abc:
cd ..
cd abc/
cat new_good
Run Code Online (Sandbox Code Playgroud)
会话示例:
abc并xyz看到我们从 docker 内部创建的内容出现在原始目录和符号链接中。会话示例:
我们终于可以去古典CMD看看它是什么样子了。我们可以看到它清楚地表明它是目录的符号链接,我们还在那里看到了目标:
如果您如上所述激活了“开发人员工具”,则唯一缺少的就是 ENV VAR。
我们可以通过在您的 Windows 主目录中编辑来设置.bashrc:
通过这样做,我们可以完全正常地使用 git-bash 并开始从 Windows 创建符号链接,而不会出现任何过载。
以这种方式创建的符号链接可以在 Windows 中工作,并且可以从 docker 内部看到。但并非相反。如果您在容器内创建符号链接,则不会在窗口中创建它们。
因此,在已安装的卷中,始终从 git-bash 设置符号链接并从容器中使用它们。如果您从容器创建它们,它们仍然可以从容器中使用。但无法在 Windows 上使用。
它可以通过 git-bash 从 Linux 风味命令完全完成。只是您需要成为管理员才能创建链接并告诉 git-bash 运行时使用该功能。并且该链接需要从 Windows 完成,而不是从 ubuntu 内部完成。
| 归档时间: |
|
| 查看次数: |
4576 次 |
| 最近记录: |