vagrant box repackage
(docs)和vagrant package
(docs)之间有什么区别?
我意识到vagrant package
仅适用于VirtualBox提供程序,但如果只使用VirtualBox,那么区别是什么?也许有vagrant package
创建的具体原因是什么?
答案 0 :(得分:13)
流浪汉包
如果你有一个正在运行的VirtualBox VM,你首先创建了没有流浪汉,使用VirtualBox做了你的事情,现在你想使用Vagrant来管理这个VM。当vagrant需要启动VM时,您将运行vagrant package
以基于现有VirtualBox VM创建一个流浪盒
流浪汉重新包装
当您的系统上安装了现有的vagrant box时,您将使用此选项。所以你使用给定框的vagrant,你将再次对VM进行更改,并且想要将这些更改(安装的软件...)保存为新框,您将在此框中运行vagrant repackage
,并且它将创建此框的更新版本,以便它可以用作新VM的启动框。
答案 1 :(得分:0)
我将回答macOS上VirtualBox提供程序的特定示例,但这可以推广到任何主机上的任何提供程序。尽管操作员没有要求,但我也会解释--base NAME
,因为我认为这有助于弄清区别。我还将使用--output OUTPUT_NAME
来区分包装的盒子。
~/code/vagrant/vm1 > vagrant package --output vm1-package.box
./.vagrant/...
目录中找到的当前正在运行的VM的正常关闭方式tar
)到./vm1-package.box
==> vm1: Attempting graceful shutdown of VM...
==> vm1: Clearing any previously set forwarded ports...
==> vm1: Exporting VM...
==> vm1: Compressing package to: /Users/user/code/vagrant/vm1/vm1-package.box
要验证:
~/code/vagrant/vm1 > tar -C /tmp/vm1 -xvf ./vm1-package.box
x ./vagrant_private_key
x ./metadata.json
x ./box.ovf
x ./Vagrantfile
x ./box-disk001.vmdk
由于这打包了由 Vagrant 管理的当前运行的VM,因此上面的列表包括vagrant_private_key
文件(由打包的Vagrantfile
加载)。
现在,我们可以将此框添加到~/.vagrant.d
中Vagrant的内部存储中:
~/code/vagrant/vm1 > vagrant box add vm1-package.box --name vm1
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'vm1' (v0) for provider:
box: Unpacking necessary files from: file:///Users/user/code/vagrant/vm1/vm1-package.box
==> box: Successfully added box 'vm1' (v0) for 'virtualbox'!
您也可以通过以下方式进行验证:
~/code/vagrant/vm1 > ls -lF ~/.vagrant.d/boxes/vm1/0/virtualbox/
total 1152400
-rw-r--r-- 1 user staff 630 13 Dec 16:26 Vagrantfile
-rw-r--r-- 1 user staff 575710720 13 Dec 16:26 box-disk001.vmdk
-rwx------ 1 user staff 6838 13 Dec 16:26 box.ovf*
-rw-r--r-- 1 user staff 25 13 Dec 16:26 metadata.json
-rw------- 1 user staff 1675 13 Dec 16:26 vagrant_private_key
~/code/vagrant/vm1 > vagrant box list
hashicorp/bionic64 (virtualbox, 1.0.282)
vm1 (virtualbox, 0)
~/code/vagrant/vm1 > vagrant package --base vm1 --output vm1-base-package.box
./.vagrant/...
目录中找到的当前正在运行的VM的正常关闭方式tar
)到./vm1-base-package.box
==> vm1: Exporting VM...
==> vm1: Compressing package to: /Users/user/code/vagrant/vm1/vm1-base-package.box
要验证:
~/code/vagrant/vm1 > tar -C /tmp/vm1-base -xvf ./vm1-base-package.box
x ./metadata.json
x ./box.ovf
x ./Vagrantfile
x ./box-disk001.vmdk
由于这会打包由 Virtualbox 管理的当前运行的VM,因此上面的列表不包含vagrant_private_key
文件。
现在,我们可以将此框添加到~/.vagrant.d
中Vagrant的内部存储中:
~/code/vagrant/vm1 > vagrant box add vm1-base-package.box --name vm1-base
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'vm1-base' (v0) for provider:
box: Unpacking necessary files from: file:///Users/user/code/vagrant/vm1/vm1-base-package.box
==> box: Successfully added box 'vm1-base' (v0) for 'virtualbox'!
~/code/vagrant/vm1 > vagrant box list
hashicorp/bionic64 (virtualbox, 1.0.282)
vm1 (virtualbox, 0)
vm1-base (virtualbox, 0)
~/code/vagrant/vm1 > ls -lF *.box
-rw-r--r-- 1 user staff 561848649 13 Dec 16:50 vm1-base-package.box
-rw-r--r-- 1 user staff 561767838 13 Dec 16:19 vm1-package.box
如果您从当前目录中删除Box文件...
~/code/vagrant/vm1 > rm *.box
...您现在可以使用vagrant repackage
找回它们:
~/code/vagrant/vm1 > vagrant box repackage vm1 virtualbox 0
这将从Vagrant的内部存储器~/.vagrant.d/...
中获取文件,然后将它们重新打包回到当前目录中的名为package.box的框中。在这种情况下,您无法使用命令命名文件,因此您可能需要重命名:
~/code/vagrant/vm1 > mv package.box vm1-package.box
,对于基本框:
~/code/vagrant/vm1 > vagrant box repackage vm1-base virtualbox 0 ~/code/vagrant/vm1 > mv package.box vm1-base.box ~/code/vagrant/vm1 > ls -lF *.box
-rw-r--r-- 1 user staff 561848571 13 Dec 17:28 vm1-base.box
-rw-r--r-- 1 user staff 561767855 13 Dec 17:24 vm1-package.box
使用和不使用--base选项时,手册对vagrant package
命令的语法不是很清楚。我认为澄清应该是:
vagrant package [options] [vm_name|vm_id]
应指定如果未指定[vm_name | vm_id],则打包当前正在运行的VM,否则,将打包[vm_name | vm_id]指定的VM。
还应指定如果使用--base选项,则命令应为:
vagrant package --base MANDATORY_NAME [vm_name|id]
,但是在这种情况下,[vm_name | id]被完全忽略,因为MANDATORY_NAME已经指定了虚拟机
我通过发出以下内容对此进行了验证: 流浪者软件包--base vm1-输出vm1-base-package.box不存在的vm-name 并且它仍然生成vm1-base-package.box,没有任何错误。