---
description: |
  The Google Compute Image Import post-processor takes a compressed raw disk
  image and imports it to a GCE image available to Google Compute Engine.
page_title: Google Compute Image Import - Post-Processors
sidebar_title: Google Compute Import
---

# Google Compute Image Import Post-Processor

Type: `googlecompute-import`

The Google Compute Image Import post-processor takes a compressed raw disk
image and imports it to a GCE image available to Google Compute Engine.

~> This post-processor is for advanced users. Please ensure you read the
[GCE import documentation](https://cloud.google.com/compute/docs/images/import-existing-image)
before using this post-processor.

## How Does it Work?

The import process operates by uploading a temporary copy of the compressed raw
disk image to a GCS bucket, and calling an import task in GCP on the raw disk
file. Once completed, a GCE image is created containing the converted virtual
machine. The temporary raw disk image copy in GCS can be discarded after the import is complete.

Google Cloud has very specific requirements for images being imported. Please
see the [GCE import documentation](https://cloud.google.com/compute/docs/images/import-existing-image)
for details.

~> **Note**: To prevent Packer from deleting the compressed RAW disk image set the `keep_input_artifact` configuration option to `true`.
See [Post-Processor Input Artifacts](/docs/templates/post-processors#input-artifacts) for more details.

## Configuration

### Required

@include 'post-processor/googlecompute-import/Config-required.mdx'

### Optional

@include 'post-processor/googlecompute-import/Config-not-required.mdx'

## Basic Example

Here is a basic example. This assumes that the builder has produced an
compressed raw disk image artifact for us to work with, and that the GCS bucket
has been created.

<Tabs>
<Tab heading="JSON">

```json
{
  "type": "googlecompute-import",
  "account_file": "account.json",
  "project_id": "my-project",
  "bucket": "my-bucket",
  "image_name": "my-gce-image"
}
```

</Tab>

<Tab heading="HCL">

```hcl
post-processor "googlecompute-import"{
  account_file = "account.json"
  bucket = "my-bucket"
  project_id = "my-project"
  image_name = "my-gce-image"
}
```

</Tab>
</Tabs>

## QEMU Builder Example

Here is a complete example for building a Fedora 31 server GCE image. For this
example Packer was run from a Debian Linux host with KVM installed.

    $ packer build -var serial=$(tty) build.json

<Tabs>
<Tab heading="JSON">

```json
{
  "variables": {
    "account_file": "account.json",
    "bucket": "my-bucket",
    "project": "my-project",
    "serial": ""
  },
  "builders": [
    {
      "type": "qemu",
      "accelerator": "kvm",
      "boot_command": [
        "<tab> console=ttyS0,115200n8 inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/fedora-31-ks.cfg rd.live.check=0<enter><wait>"
      ],
      "disk_size": "15000",
      "format": "raw",
      "iso_checksum": "sha256:225ebc160e40bb43c5de28bad9680e3a78a9db40c9e3f4f42f3ee3f10f95dbeb",
      "iso_url": "https://download-ib01.fedoraproject.org/pub/fedora/linux/releases/31/Server/x86_64/iso/Fedora-Server-dvd-x86_64-31-1.9.iso",
      "headless": "true",
      "http_directory": "http",
      "http_port_max": "10089",
      "http_port_min": "10082",
      "output_directory": "output",
      "shutdown_timeout": "30m",
      "shutdown_command": "echo 'vagrant'|sudo -S shutdown -P now",
      "ssh_username": "vagrant",
      "ssh_password": "vagrant",
      "vm_name": "disk.raw",
      "qemu_binary": "/usr/bin/kvm",
      "qemuargs": [
        ["-m", "1024"],
        ["-cpu", "host"],
        ["-chardev", "tty,id=pts,path={{user `serial`}}"],
        ["-device", "isa-serial,chardev=pts"],
        ["-device", "virtio-net,netdev=user.0"]
      ]
    }
  ],
  "post-processors": [
    [
      {
        "type": "compress",
        "output": "output/disk.raw.tar.gz"
      },
      {
        "type": "googlecompute-import",
        "project_id": "{{user `project`}}",
        "account_file": "{{user `account_file`}}",
        "bucket": "{{user `bucket`}}",
        "image_name": "fedora31-server-packertest",
        "image_description": "Fedora 31 Server",
        "image_family": "fedora31-server"
      }
    ]
  ]
}
```

</Tab>
<Tab heading="HCL">

```hcl
variables {
  account_file = "account.json"
  bucket = "my-bucket"
  project = "my-project"
  serial = ""
}

source "qemu" "example" {
    accelerator = "kvm"
    boot_command = [
      "<tab> console=ttyS0,115200n8 inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/fedora-31-ks.cfg rd.live.check=0<enter><wait>"
    ]
    disk_size = "15000"
    format = "raw"
    iso_checksum = "sha256:225ebc160e40bb43c5de28bad9680e3a78a9db40c9e3f4f42f3ee3f10f95dbeb"
    iso_url = "https://download-ib01.fedoraproject.org/pub/fedora/linux/releases/31/Server/x86_64/iso/Fedora-Server-dvd-x86_64-31-1.9.iso"
    headless = "true"
    http_directory = "http"
    http_port_max = "10089"
    http_port_min = "10082"
    output_directory = "output"
    shutdown_timeout = "30m"
		shutdown_command = "echo 'vagrant'|sudo -S shutdown -P now"
		ssh_username = "vagrant"
		ssh_password = "vagrant"
    vm_name = "disk.raw"
    qemu_binary = "/usr/bin/kvm"
    qemuargs = [
      ["-m", "1024"],
      ["-cpu", "host"],
      ["-chardev", "tty,id=pts,path=${var.serial}"],
      ["-device", "isa-serial,chardev=pts"],
      ["-device", "virtio-net,netdev=user.0"]
    ]
}

build {
  sources = ["source.qemu.example"]

  post-processors {
    post-processor "compress" {
        output = "output/disk.raw.tar.gz"
    }
    post-processor "googlecompute-import"  {
        account_file = var.account_file
        bucket = var.bucket
        project_id = var.project
        image_name = "fedora31-server-packertest"
        image_description = "Fedora 31 Server"
        image_family = "fedora31-server"
      }
    }
}
```

</Tab>
</Tabs>
