Skip to main content

Your submission was sent successfully! Close

Thank you for signing up for our newsletter!
In these regular emails you will find the latest updates from Canonical and upcoming events where you can meet our team.Close

Thank you for contacting us. A member of our team will be in touch shortly. Close

How to build Multipass images with Packer

Custom images are only supported on Linux.

Packer is a utility that lets you (re)build images to run in a variety of environments. Multipass can run those images too, provided some requirements are met (namely, the image has to boot on the hypervisor in use, and cloud-init needs to be available).

Setting up the build directory

The easiest way is to start from an existing Ubuntu Cloud Image, and the base project setup follows (you can click on the filenames to see their contents, meta-data is empty on purpose):

├── cloud-data
│   ├── meta-data
│   └── <a href="http://paste.ubuntu.com/p/6vbtNXttqZ/">user-data</a>
└── <a href="https://pastebin.ubuntu.com/p/nJsGtWk2N3/">template.json</a>

1 directory, 3 files

To specify a different image or image type, modify the iso_checksum and iso_url fields within template.json

Building the image

You will need to install QEMU and Packer (e.g. sudo apt install qemu packer), and from there you can run the following commands:

packer build template.json
multipass launch file://$PWD/output-qemu/packer-qemu --disk 5G

Now, shell into the new instance that was created, for example:

multipass shell tolerant-hammerhead

Customizing the image

Now the above works for you, delete the test instance with multipass delete --purge tolerant-hammerhead and edit the following section in the template.json file:

        {
            "type": "shell",
            "inline": ["echo Your steps go here."]
        },

Anything you do here will be reflected in the resulting image. You can install packages, configure services, anything you can do on a running system. You’ll need sudo (passwordless) for anything requiring admin privileges, or you could add this to the above provisioner to run the whole script privileged:

            "execute_command": "sudo sh -c '{{ .Vars }} {{ .Path }}'",

Next steps

Go to Packer’s documentation to learn about the QEMU builder, other provisioners and their configurations as well as everything else that might come in handy. Alternatively, you could extend user-data with other cloud-init modules to provision your image.

Join the discussion on the Multipass forum and let us know about your images!


Errors or typos? Topics missing? Hard to read? Let us know or open an issue on GitHub.

Last updated 3 months ago. Help improve this document in the forum.