如何使docker linux容器内部的符号链接可以在windows主机上看到(如果需要,可能涉及samba) 问题:
如何从windows主机查看docker linux容器的符号链接?(即使我必须放置一台中间linux机器,通过NFS或Samba公开文件系统) 上下文 在DEVEL环境中,我在办公室的Linux中的某个远程文件系统中具有以下结构:如何使docker linux容器内部的符号链接可以在windows主机上看到(如果需要,可能涉及samba) 问题:,windows,docker,filesystems,symlink,samba,Windows,Docker,Filesystems,Symlink,Samba,如何从windows主机查看docker linux容器的符号链接?(即使我必须放置一台中间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
/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
volumes:
- ./:/my-app
- ../external-packages/company:/my-app/vendor/company
开发人员需要在Windows中
因此,开发人员将他们的IDE指向某个挂载的单元,例如Z:\在那里他们可以看到所有的回购协议和项目
这使我们能够做到以下几点:
- 从它自己的文件夹编辑任何项目,并运行该项目的单元测试,包括运行
和lib-x
lib-y
- 开发任何库并在依赖的应用程序中更新它们(注意,我说我在DEVEL中,不是PRE或PROD)
- 从IDE中,可以看到任何应用程序(例如
)的“完整结构”,也可以看到app-1
和lib-x
的类,因此自动补全功能非常有效lib-y
,并运行它们装载卷
我们从linux容器内部将app-1
和app-2
中的符号链接到lib-x
和lib-y
如果我们在本地dockers中运行应用程序,这确实可以很好地工作,而且存储库也可以很好地工作
linux容器和windows主机中的符号链接存在问题
现在的问题是IDE:当它读取C:\repos\app-1中的文件时,从主机上看不到在linux容器中创建的符号链接
这使得IDE无法遵循C:\repos\app-1\vendor\lib-x,并且所有代码完成帮助程序都已中断
我已经知道Windows不支持与linux符号链接兼容的符号链接
这迫使我们寻找另一种解决方案
我们用Samba解决了这个问题
最初我认为,正如在旧的拓扑结构中一样,linux服务器通过samba共享文件系统,windows可以读取符号链接内容,因为它们在服务器端而不是客户端被解除映射,我认为我可以运行另一台带有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,那么客户端将无法访问它,因为windows中的客户端samba端口似乎是不可配置的
映射IP
因此,我尝试映射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"
但这似乎仍然会产生问题:
- 似乎IP仅用于内部docker网络,但从主机上看不到
- 原始服务似乎仍然不侦听127.0.0.1:445,而是侦听0.0.0.0:445,因此仍然“阻止”附件以侦听192.168.4.83:445
那么问题
如何使windows主机看到“符号链接的已映射内容”,使IDE看到从docker linux容器内部链接的供应商内容?我的设置遇到了类似的问题:在windows 10上开发(IDE和docker都在运行),并使网站在容器内运行(Linux)
我曾经处理过网站需要的一个库,并行处理这两个项目。为此,库目录在供应商路径中被符号链接(在主机/窗口中)
比如:
+ my-website
↪ vendor
↪ company
↪ my-package (->symlink here)
↪ ...
↪ docker-compose.yml
+ external-packages
↪ company
↪ my-package (real files here)
因此,vendor
中的文件会被web服务器(容器内)看到,我们可以在mypackage
文件夹之间保留符号链接(在windows中制作),以便IDE也能看到它们
我希望这能对你有所帮助。TL;DR
以管理员身份运行gitbash
在git bash中发布导出MSYS=winsymlinks:nativestrict
ls-s
在windows中工作abc
目录中的一些文件xyz
指向abc
ubuntu
运行docker,并更改xyz
中的内容abc
中看到更改abc
和xyz
- 在git bash中,转到
并创建一个临时目录/c
tmp
- 在它里面,创建一个
dir并在那里抛出一些内容abc
cd /c
mkdir tmp
cd tmp/
mkdir abc
cd abc/
echo 1111 > old_1
echo 2222 > old_2
echo 3333 > old_3
cd /c/tmp/
ln -s abc xyz
cd xyz/
touch new_bad
cd ../abc/
ls -l
rm -Rf xyz/
export MSYS=winsymlinks:nativestrict
winpty docker run -it --rm --mount type=bind,source="c:\tmp",target=/files --name ubuntu-link ubuntu
cd /files/
ls -l
cd xyz
echo "yeaaahh" > new_good
cd ..
cd abc/
cat new_good