使用 Packer 从 Vagrant box 创建 VM 映像?

Create a VM image from a Vagrant box using Packer?

我知道我可以使用 Packer 以脚本方式创建我自己的 VM 映像。如果我使用 VirtualBox 生成器,我可以选择两种方式之一:从头开始构建所有内容,或者在现有 VM 之上构建。

基本上,我想要实现的是在现有的 Vagrant 盒子(Ubuntu 15.04 和 Boxcutter 的 Docker 的基础上构建。

这是否可以使用 Packer,如果可以,怎么做?我无法在文档中找到任何关于此的内容。示例始终只引用 OVF/OVA 个文件。有什么提示吗?

这并不是 Packer 原生支持的工作流,但您可以编写一个小的 shell 脚本来下载 Vagrant box,导出 OVF,然后启动 Packer 的 virtualbox-ovf 构建器。

shell 脚本(注意这是硬编码到 1.1.0 版本的盒子)

#!/bin/sh

vagrant init boxcutter/ubuntu1504-docker
vagrant up --provider virtualbox --no-provision
vagrant halt

rm -rf output-virtualbox-ovf
packer build packer.json

packer.json

{
  "variables": {
    "home": "{{env `HOME`}}"
  },
  "builders": [{
    "type": "virtualbox-ovf",
    "source_path": "{{user `home`}}/.vagrant.d/boxes/boxcutter-VAGRANTSLASH-ubuntu1504-docker/1.1.0/virtualbox/box.ovf",
    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_wait_timeout": "30s",
    "shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
  }],
  "provisioners": [{
    "type": "shell",
    "inline": ["echo 'my additional provisioning steps'"]
  }],
  "post-processors": [{
    "type": "vagrant",
    "keep_input_artifact": true,
    "output": "box/modified-boxcutter-VAGRANTSLASH-ubuntu1504-docker.box"
  }]
}

这将创建一个打包在 box/modified-boxcutter-VAGRANTSLASH-ubuntu1504-docker.box 中的新 Vagrant 盒子。