Packer
Docker
@hashicorp
The docker plugin can be used with HashiCorp Packer to manage containers with Docker.
- Official
- HCP Ready
Updated 3 years ago
- GitHub(opens in new tab)
Docker Import
Type: docker-import
The Packer Docker import post-processor takes an artifact from the docker builder and imports it with Docker locally. This allows you to apply a repository and tag to the image and lets you use the other Docker post-processors such as docker-push to push the image to a registry.
Basic Example
JSON
{
  "builders": [
    {
      "type": "docker",
      "image": "ubuntu:18.04",
      "export_path": "party_parrot.tar"
    }
  ],
  "post-processors": [
    {
      "type": "docker-import",
      "repository": "local/ubuntu",
      "tag": "latest"
    }
  ]
}
HCL2
source "docker" "example" {
    image = "ubuntu:18.04"
    export_path = "party_parrot.tar"
}
build {
  sources = [
    "source.docker.example"
  ]
  post-processor "docker-import" {
    repository = "local/ubuntu"
    tag = "latest"
  }
}
Configuration
The configuration for this post-processor only requires a repository, a tag
is optional.
Required:
- repository(string) - The repository of the imported image.
Optional:
- tag(string) - The tag for the imported image. By default this is not set.
- changes(array of strings) - Dockerfile instructions to add to the commit. Example of instructions are- CMD,- ENTRYPOINT,- ENV, and- EXPOSE. Example:- [ "USER ubuntu", "WORKDIR /app", "EXPOSE 8080" ]
- keep_input_artifact(boolean) - if true, do not delete the source tar after importing it to docker. Defaults to false.
- platform(string) - Set platform if server is multi-platform capable.
Example
An example is shown below, showing only the post-processor configuration:
JSON
{
  "type": "docker-import",
  "repository": "hashicorp/packer",
  "tag": "0.7"
}
HCL2
post-processor "docker-import" {
  repository = "hashicorp/packer"
  tag = "0.7"
}
This example would take the image created by the Docker builder and import it
into the local Docker process with a name of hashicorp/packer:0.7.
Following this, you can use the docker-push post-processor to push it to a registry, if you want.
Changing Metadata
Below is an example using the changes argument of the post-processor. This
feature allows the tarball metadata to be changed when imported into the Docker
environment. It is derived from the docker import --change command line
option to
Docker.
Example uses of all of the options, assuming one is building an NGINX image from ubuntu as an simple example:
JSON
post-processor "docker-import" {
  repository = "local/centos6"
  tag = "latest"
  changes = [
    "USER www-data",
    "WORKDIR /var/www",
    "ENV HOSTNAME www.example.com",
    "VOLUME /test1 /test2",
    "EXPOSE 80 443",
    "LABEL version=1.0",
    "ONBUILD RUN date",
    "CMD [\"nginx\", \"-g\", \"daemon off;\"]",
    "ENTRYPOINT /var/www/start.sh",
  ]
}
HCL2
{
  "type": "docker-import",
  "repository": "local/centos6",
  "tag": "latest",
  "changes": [
    "USER www-data",
    "WORKDIR /var/www",
    "ENV HOSTNAME www.example.com",
    "VOLUME /test1 /test2",
    "EXPOSE 80 443",
    "LABEL version=1.0",
    "ONBUILD RUN date",
    "CMD [\"nginx\", \"-g\", \"daemon off;\"]",
    "ENTRYPOINT /var/www/start.sh"
  ]
}
Allowed metadata fields that can be changed are:
- CMD- String, supports both array (escaped) and string form
- EX: "CMD [\"nginx\", \"-g\", \"daemon off;\"]"
- EX: "CMD nginx -g daemon off;"
 
- ENTRYPOINT- String
- EX: "ENTRYPOINT /var/www/start.sh"
 
- ENV- String, note there is no equal sign:
- EX: "ENV HOSTNAME www.example.com"not"ENV HOSTNAME=www.example.com"
 
- EXPOSE- String, space separated ports
- EX: "EXPOSE 80 443"
 
- LABEL- String, space separated key=value pairs
- EX: "LABEL version=1.0"
 
- ONBUILD- String
- EX: "ONBUILD RUN date"
 
- MAINTAINER- String, deprecated in Docker version 1.13.0
- EX: "MAINTAINER NAME"
 
- USER- String
- EX: "USER USERNAME"
 
- VOLUME- String
- EX: "VOLUME FROM TO"
 
- WORKDIR- String
- EX: "WORKDIR PATH"