如何让docker linux容器内的symlinks在windows主机上被看到(如果需要的话,可能会涉及samba)。

问题描述 投票:2回答:1

问题

如何从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-1app-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-xlib-y.
  • 开发任何一个库,并让它们在相关的应用程序中更新(注意我说我在DEVEL,而不是PRE或PROD)。
  • 从IDE中,指向看到任何一个应用程序的 "完整结构"(例如 app-1),也可以看成类的 lib-xlib-y 所以自动完成等工作完美。

这样的工作方式已经持续了近十年,而且效果完美。

遇到的问题

开发者需要连接到服务器进行开发,我们想突变到本地docker,这样我们就可以让开发者在家里工作。

去docker

我们现在决定不再使用office-servers,我们将在docker容器中设置所有的开发。

实际工作内容

我们刚刚在Windows中安装了docker桌面,并将主机上的C:\repos共享到dockers中。

我们现在有一些开发机器 FROM ubuntu:xxx 并运行它们安装卷。

我们在 app-1app-2lib-xlib-y 在linux容器中运行。

如果我们在本地的dockers中运行应用程序,这确实是完美的工作,而且仓库也能正常工作。

linux容器和windows主机中的符号链接问题

现在问题出在集成开发环境上,当它读取C:\repos\app-1中的文件时,在linux容器中创建的符号链接在主机上看不到。当它读取C: \repos\app-1中的文件时, 在linux容器中创建的symlink在主机上是看不到的.

这使得IDE无法遵循C:repos/app-1/vendor/lib-x,所有的代码完成辅助程序都被破坏了。

我已经知道Windows不支持与linux符号链接兼容的符号链接。

这迫使我们不得不寻找一个替代的解决方案。

我们使用Samba的解决方案

起初我认为,在旧的拓扑结构中,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

所以我试着映射一个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主机看到 "symlinks的demapped内容",让IDE看到docker linux容器内链接的销售内容?

windows docker filesystems symlink samba
1个回答
0
投票

我在我的设置中遇到了类似的问题:在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也能看到它们。

希望这能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.