在 Windows 上使用 docker compose 进行卷绑定

问题描述 投票:0回答:10

我最近在 Windows 10 上升级了我的 Docker 工具箱,现在我的卷安装不再有效。我已经尝试了一切。这是当前的挂载路径:

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

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

windows docker docker-compose docker-machine docker-toolbox
10个回答
42
投票

用途:

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

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

这个答案来自 Spenhouet here.


29
投票
  1. 使用 docker 设置共享 nfs 路径

2.执行以下命令

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

  2. 文件复制到windows


12
投票

我认为你必须设置

COMPOSE_CONVERT_WINDOWS_PATHS=1
,见这里

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 容器


4
投票

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

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

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


3
投票

看来您使用的是位于

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

概览

转发

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

问题是目前(使用

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
    eval $(docker-machine env $MACHINE)
    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
    eval $(docker-machine env $MACHINE)
fi

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
    命令之后的新行上)。

2
投票

在 Windows 10 上,通过在主机和挂载路径的末尾添加最后一个

/
解决了这个问题,就像这样:

volumes:
  - '/c/work/vcs/app/docker/i18n/:/usr/app/target/i18n/'

没有添加最后一个

/
安装路径包含一些docker系统文件夹和符号链接。


1
投票

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

要排除此问题,请尝试从

wsl
命令行运行 docker-compose。


1
投票

我通过在第一行用

:
替换windows路径中的
/
和''来解决它。

变成那样:

 volumes:
      -/c/Users/Joey/Desktop/backend:/var/www/html

请注意:

c
一定要小


0
投票

这在我的电脑上工作:

  mongoservice:
    image : mongo
    container_name: mongodb
    restart: always
    volumes: 
      - //d/tests/leaflet_data/mongo_data/:/data/db
    ports:
     - "27018:27017"
    expose:
     - "27017"

它会把mongo数据库放到d: ests\leaflet_data\mongo_data

但我这样做的最佳解决方案是:

volumes: 
      - ./mongo_data/:/data/db

这会将 mongo db 放入您的 docker-compose yml 文件所在的同一文件夹中。它将在此工作目录中创建 mongo_data。 非常方便,只要把你需要的都放在项目目录下即可。

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