Packer
LXC Builder
Type: lxc
The lxc Packer builder builds containers for lxc1. The builder starts an LXC
container, runs provisioners within this container, then exports the container
as a tar.gz of the root file system.
The LXC builder requires a modern linux kernel and the lxc or lxc1 package.
This builder does not work with LXD.
Note: to build Centos images on a Debian family host, you will need the
yum package installed. 
Some provisioners such as ansible-local get
confused when running in a container of a different family. E.G. it will
attempt to use apt-get to install packages, when running in a Centos
container if the parent OS is Debian based.
Basic Example
Below is a fully functioning example.
{
  "builders": [
    {
      "type": "lxc",
      "name": "lxc-trusty",
      "config_file": "/tmp/lxc/config",
      "template_name": "ubuntu",
      "template_environment_vars": ["SUITE=trusty"]
    },
    {
      "type": "lxc",
      "name": "lxc-xenial",
      "config_file": "/tmp/lxc/config",
      "template_name": "ubuntu",
      "template_environment_vars": ["SUITE=xenial"]
    },
    {
      "type": "lxc",
      "name": "lxc-jessie",
      "config_file": "/tmp/lxc/config",
      "template_name": "debian",
      "template_environment_vars": ["SUITE=jessie"]
    },
    {
      "type": "lxc",
      "name": "lxc-centos-7-x64",
      "config_file": "/tmp/lxc/config",
      "template_name": "centos",
      "template_parameters": ["-R", "7", "-a", "x86_64"]
    }
  ]
}
Configuration Reference
Required:
- config_file(string) - The path to the lxc configuration file.
- template_name(string) - The LXC template name to use.
- template_environment_vars(array of strings) - Environmental variables to use to build the template with.
Optional:
- target_runlevel(number) - The minimum run level to wait for the container to reach. Note some distributions (Ubuntu) simulate run levels and may report 5 rather than 3.
- output_directory(string) - The directory in which to save the exported tar.gz. Defaults to- output-<BuildName>in the current directory.
- container_name(string) - The name of the LXC container. Usually stored in- /var/lib/lxc/containers/<container_name>. Defaults to- packer-<BuildName>.
- command_wrapper(string) - Allows you to specify a wrapper command, such as- sshso you can execute packer builds on a remote host. Defaults to Empty.
- init_timeout(string) - The timeout in seconds to wait for the the container to start. Defaults to 20 seconds.
- template_parameters(array of strings) - Options to pass to the given- lxc-templatecommand, usually located in- /usr/share/lxc/templates/lxc-<template_name>. Note: This gets passed as ARGV to the template command. Ensure you have an array of strings, as a single string with spaces probably won't work. Defaults to- [].
- create_options(array of strings) - Options to pass to- lxc-create. For instance, you can specify a custom LXC container configuration file with- ["-f", "/path/to/lxc.conf"]. Defaults to- []. See- man 1 lxc-createfor available options.
- start_options(array of strings) - Options to pass to- lxc-start. For instance, you can override parameters from the LXC container configuration file via- ["--define", "KEY=VALUE"]. Defaults to- []. See- man 1 lxc-startfor available options.
- attach_options(array of strings) - Options to pass to- lxc-attach. For instance, you can prevent the container from inheriting the host machine's environment by specifying- ["--clear-env"]. Defaults to- []. See- man 1 lxc-attachfor available options.