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

Dal*_*ius 11 vagrant

vagrant box repackage(docs)和vagrant package(docs)之间有什么区别?

我意识到vagrant package这只适用于VirtualBox提供程序,但是如果只使用VirtualBox - 有什么区别?也许vagrant package创造了一个特定的原因?

Fré*_*nri 13

流浪包

如果你有一个正在运行的VirtualBox VM,你首先创建没有流浪者,使用VirtualBox做你的事情,现在你想使用Vagrant来管理这个VM.当vagrant需要启动VM时,您将运行vagrant package基于现有VirtualBox VM创建一个vagrant框

流浪汉重新包装

当您的系统上安装了现有的vagrant box时,您将使用此选项.所以你在给定的盒子里使用vagrant,你将再次对VM进行更改,并且你想将这些更改(安装的软件......)保存为一个新的盒子,你将vagrant repackage在这个盒子上运行,它将创建一个更新的版本这个框可以用作新VM的起始框.

  • 不知何故,`repackage`命令不再存在(1.9.2).有没有办法将vm的当前状态打包为基础,包括当前Vagrantfile的私钥和网络设置?对于virtualbox我目前的操作类似于```vagrant package --base"vm_name_default_1239123913_1233213" - output"package.box"--vagrantfile Vagrantfile```其中--base参数指向实际的virtualbox vm而不是vagrant box用过的.这是可接受的方式吗? (2认同)
  • `repackage`是来自`vagrant box`的选项的一部分,它似乎仍然可用,所以`vagrant box repackage ...`将完成这项工作.否则你的命令也会达到同样的效果,但如果你从一个现有的流浪盒开始,我会选择`vagrant box repackage ...... (2认同)

Cra*_* AA 7

我将用 macOS 上 VirtualBox 提供程序的具体示例来回答,但这可以推广到任何主机上的任何提供程序。虽然没有被 op 询问,但我也会解释,--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
Run Code Online (Sandbox Code Playgroud)

验证:

~/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
Run Code Online (Sandbox Code Playgroud)

由于这打包了Vagrant管理的当前正在运行的 VM ,因此上面的列表包含vagrant_private_key文件(由打包的 加载Vagrantfile)。

现在,我们可以将此框添加到 Vagrant 的内部存储中~/.vagrant.d:

~/code/vagrant/vm1 > vagrant box 添加 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'!
Run Code Online (Sandbox Code Playgroud)

您还可以通过以下方式验证:

~/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
Run Code Online (Sandbox Code Playgroud)
~/code/vagrant/vm1 >流浪箱列表

hashicorp/bionic64              (virtualbox, 1.0.282)
vm1                             (virtualbox, 0)
Run Code Online (Sandbox Code Playgroud)

流浪包--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
Run Code Online (Sandbox Code Playgroud)

验证:

~/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
Run Code Online (Sandbox Code Playgroud)

由于这打包了Virtualbox管理的当前运行的 VM ,因此上面的列表不包含该vagrant_private_key文件。

现在,我们可以将此框添加到 Vagrant 的内部存储中~/.vagrant.d:

~/code/vagrant/vm1 > vagrant box 添加 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'!
Run Code Online (Sandbox Code Playgroud)
~/code/vagrant/vm1 >流浪箱列表

hashicorp/bionic64              (virtualbox, 1.0.282)
vm1                             (virtualbox, 0)
vm1-base                        (virtualbox, 0)
Run Code Online (Sandbox Code Playgroud)
~/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
Run Code Online (Sandbox Code Playgroud)

如果从当前目录中删除 box 文件...

~/code/vagrant/vm1 > rm *.box

......你现在可以vagrant repackage用来让他们回来:

流浪盒重新包装

~/code/vagrant/vm1 > vagrant box 重新打包 vm1 virtualbox 0

这会从 Vagrant 的内部存储中获取文件,~/.vagrant.d/...并将它们重新打包到当前目录中名为 package.box 的框中。在这种情况下,您无法使用该命令命名文件,因此您可能需要重命名它:

~/code/vagrant/vm1 > mv package.box vm1-package.box

和基本框:

~/code/vagrant/vm1 > vagrant box 重新打包 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
Run Code Online (Sandbox Code Playgroud)

附加说明

该手册对vagrant package带有和不带有 --base 选项的命令的语法不是很清楚。我认为澄清应该是:

vagrant package [options] [vm_name|vm_id]
Run Code Online (Sandbox Code Playgroud)

需要指定如果没有指定[vm_name|vm_id],则打包当前运行的VM,否则打包[vm_name|vm_id]指定的VM。

它还应该指定,如果您使用 --base 选项,命令应该是:

vagrant package --base MANDATORY_NAME [vm_name|id]
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,[vm_name|id] 被完全忽略,因为 VM 已经由 MANDATORY_NAME 指定

我通过发出以下命令验证了这一点: vagrant package --base vm1 --output vm1-base-package.box non-existent-vm-name 并且它仍然生成 vm1-base-package.box 没有任何错误。