【发布时间】: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-vbox,它可以让您使用 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-vbox 通过键盘将简化的挂载脚本写入 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.sh。VBoxManage.exe sharedfolder add在创建 VM 但尚未启动时完成。 stackoverflow.com/a/35498478/6309 -
@VonC 是的,您需要修改该文件。但是如何在不使用 VBox API 的情况下自动发送键盘敲击呢?或者这真的是最好的方法吗?
-
sharedfolder不需要在目标 VM 上添加来宾吗?
标签: python windows docker boot2docker