如何从windows主机上看到docker linux-containers的symlinks? (即使我必须放置一个中间的linux机器,通过NFS或Samba暴露文件系统)
在DEVEL环境下,我在办公室内的Linux的某个远程文件系统中,有这样的结构。
/files/repos/app-1
/files/repos/app-2
/files/repos/lib-x
/files/repos/lib-y
既有 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
开发者需要在Windows下工作
所以开发者的IDE指向一些挂载的单元,例如Z:\\,在那里他们可以看到所有的repos和项目。
这样我们就可以进行以下操作。
lib-x
和 lib-y
.app-1
),也可以看成类的 lib-x
和 lib-y
所以自动完成等工作完美。这样的工作方式已经持续了近十年,而且效果完美。
开发者需要连接到服务器进行开发,我们想突变到本地docker,这样我们就可以让开发者在家里工作。
我们现在决定不再使用office-servers,我们将在docker容器中设置所有的开发。
我们刚刚在Windows中安装了docker桌面,并将主机上的C:\repos共享到dockers中。
我们现在有一些开发机器 FROM ubuntu:xxx
并运行它们安装卷。
我们在 app-1
和 app-2
到 lib-x
和 lib-y
在linux容器中运行。
如果我们在本地的dockers中运行应用程序,这确实是完美的工作,而且仓库也能正常工作。
现在问题出在集成开发环境上,当它读取C:\repos\app-1中的文件时,在linux容器中创建的符号链接在主机上看不到。当它读取C: \repos\app-1中的文件时, 在linux容器中创建的symlink在主机上是看不到的.
这使得IDE无法遵循C:repos/app-1/vendor/lib-x,所有的代码完成辅助程序都被破坏了。
我已经知道Windows不支持与linux符号链接兼容的符号链接。
这迫使我们不得不寻找一个替代的解决方案。
起初我认为,在旧的拓扑结构中,linux服务器只是通过samba共享文件系统,而windows只能读取symlinks的内容,因为它们是在服务器端而不是客户端被demap的,我想我可以运行另一个带有samba服务器的docker机器,只是为了在本地将 "从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
但这是冲突的,因为445已经在本地使用了。
如果我关闭了本地的SMB,那么在下一次重启时,docker无法将C:/\共享到docker中(我不知道它是通过SMB共享的,是否可以变成NFS之类的?
如果我映射到另一个端口,比如10445:445,那么客户端就无法访问它,因为客户端的samba端口在windows中似乎是不可配置的。
所以我试着映射一个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"
但似乎这仍然会产生问题。
我怎样才能让windows主机看到 "symlinks的demapped内容",让IDE看到docker linux容器内链接的销售内容?
我在我的设置中遇到了类似的问题:在Windows 10上开发(IDE和Docker都在运行),并在容器(Linux)内运行网站。
我曾经在网站所需的一个库上工作,同时在两个项目上工作。而为了做到这一点,在厂商路径中,库目录被符号链接(在hostWindows中)。
类似于
+ my-website vendor company my-package (->symlink here) ... docker-compose.yml+ external-packages company my-package (real files here)
但是对于Docker来说,这种设置已经不适用了.所以,诀窍是像这样在docker-compose中挂载一个卷。
volumes:
- ./:/my-app
- ../external-packages/company:/my-app/vendor/company
所以在docker-compose中挂载一个卷,就像这样: vendor
被web服务器(在容器内)"看到",并且我们可以保留在 my-package
文件夹,所以IDE也能看到它们。
希望这能帮到你。