包装和重新包装之间的流浪差异

时间:2015-11-11 23:54:53

标签: vagrant

vagrant box repackagedocs)和vagrant packagedocs)之间有什么区别?

我意识到vagrant package仅适用于VirtualBox提供程序,但如果只使用VirtualBox,那么区别是什么?也许有vagrant package创建的具体原因是什么?

2 个答案:

答案 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

  1. 尝试从./.vagrant/...目录中找到的当前正在运行的VM的正常关闭方式
  2. 清除所有先前设置的转发端口
  3. 使用提供程序的导出工具导出VM,并添加vagrant_private_key
  4. 将所有内容存档(使用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)

无用的软件包--base vm_name


~/code/vagrant/vm1 > vagrant package --base vm1 --output vm1-base-package.box

  1. 尝试从./.vagrant/...目录中找到的当前正在运行的VM的正常关闭方式
  2. 清除所有先前设置的转发端口
  3. 使用提供程序的导出工具导出VM,但不添加vagrant_private_key
  4. 将所有内容存档(使用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,没有任何错误。