【问题标题】:Volume binding using docker compose on Windows在 Windows 上使用 docker compose 进行卷绑定
【发布时间】:2017-05-11 01:58:35
【问题描述】:

我最近在 Windows 10 上升级了我的 Docker 工具箱,现在我的卷挂载不再工作。我什么都试过了。这是当前的挂载路径:

volumes:
  - C:\Users\Joey\Desktop\backend:/var/www/html

我收到一个无效的绑定安装错误。

【问题讨论】:

    标签: windows docker docker-compose docker-machine docker-toolbox


    【解决方案1】:
    1. 使用 docker 设置共享 nfs 路径

    2.执行以下命令

    docker run --rm -v c:/Users:/data alpine ls /data
    
    1. 在docker compose文件中设置路径如下图

    2. 文件复制到窗口

    【讨论】:

      【解决方案2】:

      用途:

      volumes:
        - "C:/Users/Joey/Desktop/backend:/var/www/html"
      

      将整个内容放在双引号中并使用正斜杠对我有用。 我在 Windows 10 中通过 WSL2 使用 Linux 容器在 Windows 10 上

      这个答案来自 Spenhouet 给出的here

      【讨论】:

      • 如果 windows 文件路径中没有空格,则此方法有效。
      【解决方案3】:

      我认为你必须设置COMPOSE_CONVERT_WINDOWS_PATHS=1,见here

      Docker Machine 应该会自动完成:https://github.com/docker/machine/pull/3830

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题(我正在使用 Docker Desktop)。

        我的步骤是:

        1) 将您的文件夹放在驱动器“C”下

        2)在Docker Desktop中打开“设置”->“共享驱动器”->“重置凭据”->选择驱动器“C”->“应用”

        3) 打开终端并运行(由 Docker Desktop 提议):
        docker run --rm -v c:/Users:/data alpine ls /data

        4) 打开您的docker-compose.yml 并更新-volumes 中的路径:

        volumes:
          - /data/YOUR_USERNAME/projects/my_project/jssecacerts:/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/jssecacerts/
        

        5) 重启 docker 容器

        【讨论】:

          【解决方案5】:

          这个解决方案对我有用,在 docker-compose.yml 中:

              volumes:
                - c/Users/Cyril/django:/mydjango
          

          (带有 WSL2 和 Docker 桌面的 Windows 10)

          【讨论】:

            【解决方案6】:

            看来您使用的是位于C:\Users 目录内的绝对路径,这对我也不起作用,如果您使用的是Docker-Toolbox,请参见下文。

            概述

            转发volumes 部分中的./ 相对路径将自动由docker-compose 解析到包含docker-compose.yml 文件的目录(例如,如果您的项目在%UserProfile%/my-project 中,那么./:/var/www/html 会得到@987654329 @)。

            问题是目前(使用DockerToolbox-19.03.1)只有/c/Users 目录与虚拟机共享(工具箱将docker 本身放在VM 中,这意味着它无法访问您的文件系统,除了挂载的共享目录)。

            结论

            所以,基本上把你的项目放在那里 (C:\Users\YOUR_USER_NAME) 应该可以让 ./ 工作。 但是这对我来说甚至都不起作用,我们最终得到了下面的_prepare.sh 脚本:

            #!/bin/bash
            
            VBoxManage='/c/Program Files/Oracle/VirtualBox/VBoxManage'
            
            # Defines variables for later use.
            ROOT=$(dirname $0)
            ROOT=$(cd "$ROOT"; pwd)
            MACHINE=default
            PROJECT_KEY=shared-${ROOT##*/}
            
            # Prepares machine (without calling "docker-machine stop" command).
            #
            if [ $(docker-machine status $MACHINE 2> /dev/null) = 'Running' ]; then
                echo Unmounting volume: $ROOT
                docker-compose down
                docker-machine ssh $MACHINE <<< '
                    sudo umount "'$ROOT'";
                '
                "$VBoxManage" sharedfolder remove $MACHINE --name "$PROJECT_KEY" -transient > /dev/null 2>&1
            else
                docker-machine start $MACHINE
            fi
            eval $(docker-machine env $MACHINE)
            
            set -euxo pipefail
            "$VBoxManage" sharedfolder add $MACHINE --name "$PROJECT_KEY" --hostpath "$ROOT" -automount -transient
            
            
            docker-machine ssh $MACHINE <<< '
                echo Mounting volume: '$ROOT';
                sudo mkdir -p "'$ROOT'";
                sudo mount -t vboxsf -o uid=1000,gid=50 "'$PROJECT_KEY'" "'$ROOT'";
            '
            
            docker-compose up -d
            docker-machine ssh $MACHINE
            bash
            

            用法:

            • 将其副本放在每个项目的 docker-compose.yml 文件旁边。
            • 每次打开系统时运行它(只需双击它或它的快捷方式)。
            • 完成!即使您的项目位于另一个驱动器中(远离C:\Users 目录),相对路径现在也应该可以工作。

            注意:

            • 稍作修改,它应该可以在不需要docker-compose 的情况下工作。
            • 考虑运行docker system prune 以释放磁盘空间(或简单地将docker system prune --force 添加到上述脚本,在mount 命令之后的新行上)。

            【讨论】:

              【解决方案7】:

              如果您使用的是新的 Docker WSL2 后端,某些驱动器可能不会安装在任何 WSL 中(因此 Docker 也无法看到它们)。例如,D: 或 E: 或 USB 驱动器。见

              要排除此问题,请尝试从 wsl 命令行运行 docker-compose。

              【讨论】:

                猜你喜欢
                • 2018-09-24
                • 2019-06-27
                • 2019-08-17
                • 2019-04-29
                • 2019-01-09
                • 1970-01-01
                • 2018-11-30
                • 2020-03-17
                • 2020-02-07
                相关资源
                最近更新 更多