如何在 Windows 上将 --volume 选项与 Docker 工具箱一起使用?

How to use --volume option with Docker Toolbox on Windows?

如何使用 Docker 工具箱通过简单的 --volume 命令挂载卷,从而在我的 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'.

关注this,我也试过了

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'.

这实际上是一个 issue of the project 并且有 2 个解决方法:

  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
    

试试这个:

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

如果错误是由于错字造成的,它会起作用。您将在您的用户目录中获得一个名为 ubuntu 的空文件夹。您将在 ubuntu 容器中看到名为 windows 的文件夹。

截至 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 虚拟机,我认为这让 hyper-v 中的 'docker-machine' 虚拟机 运行 可以访问它驾驶。然后你必须使用那里显示的格式,它似乎只存在于这一张图片中,没有我在网上找到的文档或问题:

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

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

在windows7中,我使用了docker工具箱。它使用了 Virtual Box。

  1. 打开虚拟盒子
  2. Select 机器(在我的例子中是默认值)。
  3. 右键单击并 select 设置选项
  4. 转到共享文件夹
  5. 包括一个新的计算机文件夹。

例如,在我的例子中,我包括:

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

使用这个命令:

$ docker-machine restart

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

  1. SSH 到 docker 机器。

使用这个命令:

$ docker-machine ssh
  1. 转到您拥有的文件夹 shared/mounted。

在我的例子中,我使用这个命令

$ 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

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

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

1) 确保 docker-机器不是 运行

Docker 快速启动终端:

docker-machine stop

2) 创建共享Windows <-> 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-机器并将卷装入新容器

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

我解决了!

添加卷:

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

挂载主机目录:

docker 运行 -d -v C:\Temp3:C:\My\Shared\Dir testimage:latest

如果您正在寻找能够解决所有 Windows 问题并使其在 Windows OS 上以与在 Linux 上相同的方式工作的解决方案,然后看下面。我对此进行了测试,它适用于所有情况。我还展示了我是如何得到它的(步骤和思考过程)。 I've also wrote an article about using Docker and dealing with with docker issues here.

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

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

奖金:

  • 一切都与 Linux
  • 上的一样
  • Pause/Unpause docker随心所欲的环境

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

  • 读到有人将文件夹移动到 /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(不超过几个月)
  • 请注意,自动挂载并没有真正发挥作用,而且集成也被破坏了(比如剪贴板共享等)
  • 删除虚拟机
  • 出去喝一杯
  • 租昂贵的车在高速公路上高速行驶
  • 毁车而死
  • 在你的电脑前重生
  • 安装 Ubuntu 超过 1 年的 LTS
  • 尝试运行docker
  • 注意它没有安装
  • 通过 apt-get install 安装 docker docker
  • 安装建议docker.io
  • 尝试运行 docker-撰写
  • 注意它没有安装
  • 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 命令)
  • 完成

我在 Windows 7:

上简单地使用双前导斜杠对我有用
docker run --rm -v //c/Users:/data alpine ls /data/

取自此处:https://github.com/moby/moby/issues/12590

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

使用... Docker 快速启动终端 [QST] Windows 探索者 [我们]

让我们开始...

  1. [QST] 打开Docker 快速启动终端

  2. [QST] 停止虚拟机

$docker-机器停止

  1. [WE] 打开一个 windows 资源管理器

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

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

C:\Program Files\Oracle\VirtualBox>VBoxManage 共享文件夹添加 "default" --name "/d/SVN_FOLDERS/X2R2_WP6/nodejs" --hostpath "\?\d:\SVN_FOLDERS\X2R2_WP6\nodejs" --automount

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

  2. [QST] 启动虚拟机

$docker-机器启动

  1. [QST] 运行 容器 nodejs

docker 停止 nodejs

docker rm nodejs

docker 运行 -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,你会看到共享文件