gpt4 book ai didi

windows - 如何制作从 docker linux 容器内部制作的符号链接(symbolic link),以便从 Windows 主机上看到(如果需要,可能涉及 samba)

转载 作者:行者123 更新时间:2023-12-02 18:27:23 31 4
gpt4 key购买 nike

问题

如何从 Windows 主机查看 docker linux-containers 的符号链接(symbolic link)? (即使我必须放置一台通过 NFS 或 Samba 公开文件系统的中间 linux 机器)

语境

在 DEVEL 环境中,我在办公室内 Linux 的某个远程文件系统中具有以下结构:

/files/repos/app-1
/files/repos/app-2
/files/repos/lib-x
/files/repos/lib-y
app-1app-2 都使用像这样的供应商和符号链接(symbolic link)的库:
/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:\,他们可以在其中看到所有存储库和项目。

这使我们能够:
  • 从它自己的文件夹中编辑任何项目,并为该项目运行单元测试,包括运行 lib-xlib-y
  • 开发任何库并在依赖的应用程序中更新它们(注意我说我在开发,而不是 PRE 或 PROD)。
  • 从 IDE 中,指向任何应用程序的“完整结构”(例如 app-1 )也可以看到 lib-xlib-y 的类,因此自动完成等工作完美。

  • 这已经像这样工作了近十年并且完美地工作。

    问题

    开发人员需要连接到服务器才能进行开发,我们希望转变为本地 docker,这样我们就可以让开发人员在家工作。

    去码头

    我们现在决定不再使用办公室服务器,我们将在 docker 容器中设置所有开发。

    什么实际工作

    我们刚刚在 Windows 中安装了 docker desktop 并将 C:\repos 从主机共享到 dockers。

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

    我们将 app-1app-2 中的符号链接(symbolic link)从 linux 容器内部连接到 lib-xlib-y

    如果我们在本地 dockers 中运行应用程序,这确实可以完美运行,并且存储库也可以正常工作

    linux容器和windows主机中的符号链接(symbolic link)问题

    现在的问题是 IDE:当它读取 C:\repos\app-1 中的文件时,主机无法看到在 linux 容器中创建的符号链接(symbolic link)。

    这使得 IDE 无法跟随 C:\repos\app-1\vendor\lib-x 并且所有代码完成助手都被破坏了。

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

    这迫使我们寻找替代解决方案。

    我们使用 Samba 的解决方案

    最初我认为,以及在旧拓扑中,Linux 服务器只是通过 samba 共享文件系统,Windows 只能读取符号链接(symbolic link)内容,因为它们在服务器端而不是客户端被解映射,我认为我可以运行另一台 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

    但这会发生冲突,因为 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 主机看到“符号链接(symbolic link)的解映射内容”,以使 IDE 看到从 docker linux 容器内部链接的供应商内容?

    最佳答案

    我的设置遇到了类似的问题:在 Windows 10 上开发(IDE 和 Docker 都在其中运行),并使网站在容器内运行 (Linux)。

    我曾经在一个网站需要的库上工作,同时在两个项目上工作。为此,库目录在供应商路径中被符号链接(symbolic link)(在主机/Windows 中)。

    就像是:

    + my-website    ↪ vendor      ↪ company        ↪ my-package (->symlink here)  ↪ ...  ↪ docker-compose.yml+ external-packages    ↪ company      ↪ my-package (real files here)

    But with Docker, that setup doesn't work anymore.So the trick is to mount a volume in docker-compose like this:

    volumes:
    - ./:/my-app
    - ../external-packages/company:/my-app/vendor/company

    因此 vendor 中的文件被 Web 服务器(在容器内)“看到”,我们可以在 my-package 文件夹之间保留符号链接(symbolic link)(在 Windows 中创建),因此 IDE 也能看到它们。

    我希望这能帮到您。

    关于windows - 如何制作从 docker linux 容器内部制作的符号链接(symbolic link),以便从 Windows 主机上看到(如果需要,可能涉及 samba),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58857724/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com