Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使docker linux容器内部的符号链接可以在windows主机上看到(如果需要,可能涉及samba) 问题:_Windows_Docker_Filesystems_Symlink_Samba - Fatal编程技术网

如何使docker linux容器内部的符号链接可以在windows主机上看到(如果需要,可能涉及samba) 问题:

如何使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

如何从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/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
    的类,因此自动补全功能非常有效
这已经像这样工作了近十年,效果非常好

问题 开发人员需要与服务器的连接才能开发,我们希望能够变异为本地dockers,这样我们就可以让开发人员在家里工作

去码头 我们现在决定不再使用office服务器,我们将在docker容器中设置所有开发

什么是真正有效的 我们刚刚在Windows中安装了docker desktop,并将主机上的C:\repo共享到docker中

我们现在有一些来自ubuntu:xxx的devel机器
,并运行它们装载卷

我们从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中工作
  • 链接可以从docker内部看到
  • 细节 我们将走过以下步骤:

  • 准备:准备一个临时目录,其中包含
    abc
    目录中的一些文件
  • 看到它失败:我们将尝试创建一个符号链接并看到它失败
  • 创建符号链接:我们将在windows中创建符号链接并查看它。我们将
    xyz
    指向
    abc
  • 运行docker:然后我们将使用
    ubuntu
    运行docker,并更改
    xyz
    中的内容
  • 签入ubuntu容器:我们将在docker中的
    abc
    中看到更改
  • 签入windows主机:从容器外部同时检查
    abc
    xyz
  • 1.准备
    • 在git bash中,转到
      /c
      并创建一个临时目录
      tmp
    • 在它里面,创建一个
      abc
      dir并在那里抛出一些内容
    这是一个样本
    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