40

如何通过--volume使用 Docker Toolbox 使用简单命令安装卷来在 Windows 文件和 docker 容器之间共享文件夹?

我正在使用“Docker Quickstart Terminal”,当我尝试这个时:

winpty docker run -it --rm --volume /C/Users/myuser:/myuser ubuntu

我有这个错误:

Invalid value "C:\\Users\\myuser\\:\\myuser" for flag --volume: bad mount mode specified : \myuser
See 'docker run --help'.

之后,我也尝试了

winpty docker run -it --rm --volume "//C/Users/myuser:/myuser" ubuntu

并得到

Invalid value "\\\\C:\\Users\\myuser\\:\\myuser" for flag --volume: \myuser is not an absolute path
See 'docker run --help'.
4

9 回答 9

45

这是所选答案的改进,因为该答案仅限于 c:\Users 文件夹。如果您想使用 c:\Users 之外的目录创建卷,这是一个扩展。

在 Windows 7 中,我使用了 docker 工具箱。它使用了虚拟盒子。

  1. 打开虚拟盒子
  2. 选择机器(在我的情况下为默认)。
  3. 右键单击并选择设置选项
  4. 转到共享文件夹
  5. 包括一个新的机器文件夹。

例如,就我而言,我包括:

**Name**: c:\dev
**Path**: c/dev
  1. 单击并关闭
  2. 打开“Docker Quickstart Terminal”并重新启动 docker 机器。

使用这个命令:

$ docker-machine restart

要验证它是否有效,请执行以下步骤:

  1. SSH 到 docker 机器。

使用此命令:

$ docker-machine ssh
  1. 转到您已共享/安装的文件夹。

就我而言,我使用此命令

$ cd /c/dev
  1. 检查文件夹的用户所有者。您可以使用“ls -all”并验证所有者将是“docker”

你会看到这样的东西:

docker@default:/c/dev$ ls -all
total 92
drwxrwxrwx    1 docker   staff         4096 Feb 23 14:16 ./
drwxr-xr-x    4 root     root            80 Feb 24 09:01 ../
drwxrwxrwx    1 docker   staff         4096 Jan 16 09:28 my_folder/

在这种情况下,您将能够为该文件夹创建一个卷。

您可以使用以下命令:

docker create -v /c/dev/:/app/dev --name dev image
docker run -d -it --volumes-from dev image

或者

docker run -d -it -v /c/dev/:/app/dev image

这两个命令都对我有用。我希望这会有用。

于 2017-02-24T09:30:41.030 回答
30

这实际上是项目的一个问题,有两种解决方法:

  1. 创建数据卷:

    docker create -v //c/Users/myuser:/myuser --name data hello-world
    winpty docker run -it --rm --volumes-from data ubuntu
    
  2. 直接在 docker 主机上 SSH:

    docker-machine ssh default
    

    从那里开始经典:

    docker run -it --rm --volume /c/Users/myuser:/myuser ubuntu
    
于 2015-10-15T14:38:51.083 回答
6

如果您正在寻找能够解决所有 Windows 问题并使其以与 Linux 相同的方式在 Windows 操作系统上运行的解决方案,请参见下文。我对此进行了测试,它适用于所有情况。我也在展示我是如何得到它的(步骤和思考过程)。我还在这里写了一篇关于使用 Docker 和处理 Docker 问题的文章。

解决方案 1:使用 VirtualBox(如果您认为这不是一个好主意,请参阅下面的解决方案 2)

  • 打开 VirtualBox(您已经将它与 docker 工具一起安装)
  • 创建虚拟机
  • (这是可选的,您可以跳过它并从 VM 转发端口)创建第二个以太网卡 - 桥接,这样它将从您的网络接收 IP 地址(它将具有类似 docker 机器的 IP)
  • 安装超过 1 年的 Ubuntu LTS
  • 安装泊坞窗
  • 将共享目录添加到虚拟机并自动挂载您的项目目录(这样您就可以从 Ubuntu 访问项目目录)但仍然可以在 Windows 中工作
  • 完毕

奖金:

  • 一切都以与 Linux 相同的方式工作
  • 随时暂停/取消暂停 dockerized 环境

解决方案2:使用VirtualBox(这与解决方案1非常相似,但也显示了思考过程,这在解决类似问题时可能很有用)

  • 读到有人将文件夹移动到 /C/Users/Public 并且有效https://forums.docker.com/t/sharing-a-volume-on-windows-with-docker-toolbox/4953/2
  • 尝试一下,意识到它对你的情况没有多大意义。
  • 在此处阅读整个页面https://github.com/docker/toolbox/issues/607并尝试页面上列出的所有解决方案
  • 找到此页面(您现在正在阅读的页面)并尝试其他评论中的所有解决方案
  • 在某处查找设置 COMPOSE_CONVERT_WINDOWS_PATHS=1 环境变量可能解决问题的信息。
  • 停止寻找解决方案几个月
  • 返回并再次检查相同的链接
  • 深深哭泣
  • 感受启蒙时刻
  • 打开 VirtualBox(您已经将它与 docker 工具一起安装)
  • 使用第二个以太网卡创建虚拟机 - 桥接,这样它将从您的网络接收 IP 地址(它将具有类似 docker 机器的 IP)
  • 安装最新的 Ubuntu LTS(不超过几个月)
  • 请注意,自动挂载并没有真正起作用,并且集成被破坏(如剪贴板共享等)
  • 删除虚拟机
  • 出去喝一杯
  • 租昂贵的汽车,在高速公路上高速行驶
  • 摧毁汽车并死亡
  • 在你的电脑前重生
  • 安装超过 1 年的 Ubuntu LTS
  • 尝试运行 docker
  • 注意没有安装
  • 通过 apt-get install docker 安装 docker
  • 安装建议的 docker.io
  • 尝试运行 docker-compose
  • 注意没有安装
  • apt get install docker-compose
  • 尝试使用 docker-compose 运行您的项目
  • 注意是旧版本
  • 检查您的功率水平(应该超过 9000)
  • 搜索如何安装最新版本的 docker 并找到官方指南https://docs.docker.com/install/linux/docker-ce/ubuntu/
  • 卸载当前的 docker-compose 和 docker.io
  • 使用官方指南安装 docker https://docs.docker.com/install/linux/docker-ce/ubuntu/
  • 将共享目录添加到虚拟机并自动挂载您的项目目录(这样您就可以从 Ubuntu 访问项目目录,因此您可以运行任何 docker 命令)
  • 完毕
于 2018-05-29T18:53:30.003 回答
5

截至 2016 年 8 月,Docker for windows 现在直接使用 hyper-v 而不是 virtualbox,所以我认为它有点不同。首先在设置中共享驱动器,然后使用C:驱动器号格式,但使用正斜杠。例如,我创建了一个H:\t\REDIS目录,并且能够/data使用以下命令将其安装在容器中:

docker run -it --rm -v h:/t/REDIS:/data redis sh

相同的格式,使用驱动器号和冒号,然后使用正斜杠作为路径分隔符,在 Windows 命令提示符和 git bash 中都有效。

我发现这个问题在谷歌上搜索以找到答案,但我找不到任何有效的方法。事情似乎没有抛出任何错误,但我只是看不到主机上的数据(反之亦然)。最后我仔细检查了设置并尝试了它们显示的格式:

在此处输入图像描述

因此,首先,您必须在此处的设置中将整个驱动器共享给 docker vm,我认为这可以让运行在 hyper-v 中的 'docker-machine' vm 访问该驱动器。然后你必须使用那里显示的格式,它似乎只存在于这张图片中,而且我在网上找不到任何文档或问题:

docker run --rm -v c:/Users:/data alpine ls /data
于 2016-08-27T13:41:36.390 回答
5

只需在 Windows 7 上使用双前导斜杠即可:

docker run --rm -v //c/Users:/data alpine ls /data/

取自这里:https ://github.com/moby/moby/issues/12590

于 2019-01-21T19:37:41.080 回答
4

尝试这个:

  1. 打开Docker 快速入门终端。如果它已经打开,请运行$ cd ~以确保您位于 Windows 用户目录中。
  2. $ docker run -it -v /$(pwd)/ubuntu:/windows ubuntu

如果错误是由于拼写错误引起的,它将起作用。ubuntu您将获得一个在您的用户目录中命名的空文件夹。windows您将在您的 ubuntu 容器中看到此文件夹的名称。

于 2016-04-22T12:47:07.477 回答
3

对于喜欢命令行方法的使用Virtual Box的用户

1) 确保 docker-machine 没有运行

Docker 快速入门终端:

docker-machine stop

2) 创建共享窗口 <-> docker-machine

Windows 命令提示符:(
修改以下内容以适合您的场景。我从通过 Dropbox 同步的目录中提供我的 Apache httpd 容器。)

set VBOX=D:\Program Files\Oracle\VirtualBox\VBoxManage.exe
set VM_NAME=default
set NAME=c/htdocs
set HOSTPATH=%DROPBOX%\htdocs
"%VBOX%" sharedfolder add "%VM_NAME%" --name "%NAME%" --hostpath "%HOSTPATH%" --automount

3) 启动 docker-machine 并将卷挂载到新容器中

Docker 快速入门终端:(
同样,我正在启动一个 Apache httpd 容器,因此该端口会暴露。)

docker-machine start
docker run -d --name my-apache-container-0 -p 80:80 -v /c/htdocs:/usr/local/apache2/htdocs my-apache-image:1.0
于 2017-06-19T19:48:00.513 回答
1

共享文件夹 virtualBox 工具箱和 windows 7 和 nodejs 图像容器

使用... Docker 快速入门终端 [QST] Windows 资源管理器 [WE]

开始吧...

  1. [QST] 打开 Docker 快速入门终端

  2. [QST] 停止虚拟机

$码头机器停止

  1. [WE] 打开 Windows 资源管理器

  2. [WE] 进入 virtualBox 安装目录

  3. [WE] 打开一个cmd并执行...

C:\Program Files\Oracle\VirtualBox>VBoxManage sharedfolder add "default" --name "/d/SVN_FOLDERS/X2R2_WP6/nodejs" --hostpath "\?\d:\SVN_FOLDERS\X2R2_WP6\nodejs" --automount

  1. 检查 oracle 虚拟机,新的共享文件夹已经出现

  2. [QST] 启动虚拟机

$ 码头机器启动

  1. [QST] 运行容器 nodejs

码头工人停止 nodejs

docker rm nodejs

docker run -d -it --rm --name nodejs -v /d/SVN_FOLDERS/X2R2_WP6/nodejs:/usr/src/app -w /usr/src/app node2

  1. [QST] 打开 bash 到容器

docker exec -i -t nodejs /bin/bash

  1. [QST] 执行 dir 即可看到共享文件
于 2019-01-24T13:07:30.483 回答
0

我解决了!

添加卷:

docker run -d -v my-named-volume:C:\MyNamedVolume testimage:latest

挂载主机目录:

docker run -d -v C:\Temp\123:C:\My\Shared\Dir testimage:latest

于 2017-10-02T17:06:32.103 回答