【问题标题】:Automatically mounting host folders other than c:\Users in Docker images in Windows在 Windows 的 Docker 映像中自动挂载除 c:\Users 以外的主机文件夹
【发布时间】:2016-06-19 07:24:41
【问题描述】:

我有一个程序需要自动在 Windows 上使用最少的用户输入安装和管理一些 Docker 容器。

它需要自动设置 Docker 来挂载任意 Windows 文件夹。它需要从 全新安装 中执行此操作,不能假定已创建 Docker VM。

默认情况下,Docker 将允许 C:\Users 中的几乎所有文件夹挂载到其 Boot2Docker 映像,这反过来又使它们可以自己挂载到 Docker 映像中。

我想要一种从 VM 外部自动修改默认挂载脚本的方法,以便我可以使用其他文件夹,但是“VBoxManage.exe run”、copyto 等命令在 Boot2Docker 上无论如何都不起作用,与我拥有的其他 Linux VM 不同。

因此,在寻求解决方案的过程中,我偶然发现了 py-vb​​ox,它可以让您使用 VirtualBox API 轻松地将键盘事件发送到控制台。它还允许直接控制台会话,但它们会像 VBoxManage.exe 一样失败。所以,最后我发送了很多

echo command >> /c/script.sh

通过键盘命令来设置一个脚本来安装额外的卷。有没有更好的办法?

对于任何可能需要它的人,这里有一个非常简化的版本。前两位是旧的 .bat 文件,因此它们适用于任何人。首先,创建我们的 docker 虚拟机:

set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"
docker-machine create --driver virtualbox my-docker-vm
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" sharedfolder add "my-docker-vm" --name "c/myfolder" --hostpath "c:\myfolder" --automount
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "my-docker-vm" VBoxInternal2/SharedFoldersEnableSymlinksCreate/c/myfolder 1

那么,docker 虚拟机必须启动...

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm --type=headless my-docker-vm
set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"
docker-machine env --shell cmd my-docker-vm > temp.cmd
call temp.cmd
del temp.cmd

现在,使用 py-vb​​ox 通过键盘将简化的挂载脚本写入 VM 的 Python 脚本的简化版本:

import virtualbox
script = """\n\
echo if [ ! -d /c/myfolder ] > /c/script.sh\n\
echo then >> /c/script.sh\n\
echo     mkdir -p /c/myfolder >> /c/script.sh\n\
echo     mount -t vboxsf c/myfolder /c/myfolder >> /c/script.sh\n\
echo fi >> /c/script.sh\n\
chmod +x /c/script.sh\n\
/bin/sh /c/script.sh\n\
rm /c/script.sh\n\
"""
my_vm_name = 'my-docker-vm'

def mount_folder():
    vbox = virtualbox.VirtualBox()
    is_there = False
    for vmname in vbox.machines:
        if str(vmname) == my_vm_name:
            is_there = True
            break
    if is_there is False:
        raise whatever
        return

    vm = vbox.find_machine(my_vm_name)
    session = vm.create_session()
    session.console.keyboard.put_keys(script)

【问题讨论】:

  • 看看这个链接对你有没有帮助incrediblemolk.com/…。命令是vboxmanage sharedfolder
  • @warmoverflow 谢谢,但我已经用谷歌搜索过了。此解决方案将删除对 c:\users 的访问权限,而且似乎也不适用于最新版本,至少不适用于我的机器。
  • 为什么需要从虚拟机执行这些命令?你在VM中唯一需要做的就是修改/var/lib/boot2docker/bootlocal.shVBoxManage.exe sharedfolder add 在创建 VM 但尚未启动时完成。 stackoverflow.com/a/35498478/6309
  • @VonC 是的,您需要修改该文件。但是如何在不使用 VBox API 的情况下自动发送键盘敲击呢?或者这真的是最好的方法吗?
  • sharedfolder 不需要在目标 VM 上添加来宾吗?

标签: python windows docker boot2docker


【解决方案1】:

如 cmets 中所述:

C:\Users 文件夹使用 VirtualBox 的共享文件夹功能与 VM 共享。只需添加另一个共享文件夹即可。这可以从命令行通过VBoxManage sharedfolder add <uuid|vmname> --name <name> --hostpath <path> [--transient] [--readonly] [--automount] 实现。之后您可能需要重新启动 VM。

较新的 Windows 版本中的另一个选项是在 C:\Users 文件夹中的某个位置安装您想要的任何文件夹,例如C:\Users\myuser\dockerdata

【讨论】:

  • 很遗憾,添加共享文件夹不起作用。您将看到使用 vboxmanage 是我的解决方案的一部分,但让该挂载可用于在内部运行的 VM 是问题所在。此外,当需要不同用户访问时,将文件夹挂载到 c:\users\wherever 很困难,以及可能没有用户文件夹的服务等。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 2020-08-30
  • 1970-01-01
  • 2018-01-20
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多