» Oracle Cloud Infrastructure Classic Compute Builder

Type: oracle-classic

The oracle-classic Packer builder is able to create custom images for use with Oracle Cloud Infrastructure Classic Compute. The builder takes a base image, runs any provisioning necessary on the base image after launching it, and finally snapshots it creating a reusable custom image.

It is recommended that you familiarise yourself with the Key Concepts and Terminology prior to using this builder if you have not done so already.

The builder does not manage images. Once it creates an image, it is up to you to use it or delete it.

» Authorization

This builder authenticates API calls to Oracle Cloud Infrastructure Classic Compute using basic authentication (user name and password). To read more, see the authentication documentation

» Configuration Reference

There are many configuration options available for the oracle-classic builder. This builder currently only works with the SSH communicator.

» Required

  • api_endpoint (string) - This is your custom API endpoint for sending requests. Instructions for determining your API endpoint can be found here

  • dest_image_list (string) - Where to save the machine image to once you've provisioned it. If the provided image list does not exist, Packer will create it.

  • identity_domain (string) - This is your customer-specific identity domain as generated by Oracle. If you don't know what your identity domain is, ask your account administrator. For a little more information, see the Oracle documentation.

  • source_image_list (string) - This is what image you want to use as your base image. See the documentation for more details. You may use either a public image list, or a private image list. To see what public image lists are available, you can use the CLI, as described here

  • password (string) - Your account password.

  • shape (string) - The template that determines the number of CPUs, amount of memory, and other resources allocated to a newly created instance. For more information about shapes, see the documentation here.

  • username (string) - Your account username.

» Optional

  • attributes (string) - (string) - Attributes to apply when launching the instance. Note that you need to be careful about escaping characters due to the templates being JSON. It is often more convenient to use attributes_file, instead. You may only define either attributes or attributes_file, not both.

  • attributes_file (string) - Path to a json file that will be used for the attributes when launching the instance. You may only define either attributes or attributes_file, not both.

  • image_description (string) - a description for your destination image list. If you don't provide one, Packer will provide a generic description.

  • ssh_username (string) - The username that Packer will use to SSH into the instance; defaults to opc, the default oracle user, which has sudo privileges. If you have already configured users on your machine, you may prompt Packer to use one of those instead. For more detail, see the documentation.

  • image_name (string) - The name to assign to the resulting custom image.

  • snapshot_timeout (string) - How long to wait for a snapshot to be created. Expects a positive golang Time.Duration string, which is a sequence of decimal numbers and a unit suffix; valid suffixes are ns (nanoseconds), us (microseconds), ms (milliseconds), s (seconds), m (minutes), and h (hours). Examples of valid inputs: 100ms, 250ms, 1s, 2.5s, 2.5m, 1m30s. Example: "snapshot_timeout": "15m". Default: 20m.

» Basic Example

Here is a basic example. Note that account specific configuration has been obfuscated; you will need to add a working username, password, identity_domain, and api_endpoint in order for the example to work.

    "builders": [
            "type": "oracle-classic",
            "username": "myuser@myaccount.com",
            "password": "supersecretpasswordhere",
            "identity_domain": "#######",
            "api_endpoint": "https://api-###.compute.###.oraclecloud.com/",
            "source_image_list": "/oracle/public/OL_7.2_UEKR4_x86_64",
            "shape": "oc3",
            "image_name": "Packer_Builder_Test_{{timestamp}}",
            "attributes": "{\"userdata\": {\"pre-bootstrap\": {\"script\": [\"...\"]}}}",
            "dest_image_list": "Packer_Builder_Test_List"
    "provisioners": [
            "type": "shell",
            "inline": ["echo hello"]

» Basic Example -- Windows

Attributes file is optional for connecting via ssh, but required for winrm.

The following file contains the bare minimum necessary to get winRM working; you have to give it the password to give to the "Administrator" user, which will be the one winrm connects to. You must also whitelist your computer to connect via winRM -- the empty braces below whitelist any computer to access winRM but you can make it more secure by only allowing your build machine access. See the docs for more details on how to define a trusted host.

Save this file as windows_attributes.json:

    "userdata": {
        "administrator_password": "password",
        "winrm": {}

Following is a minimal but working Packer config that references this attributes file:

    "variables": {
        "opc_username": "{{ env `OPC_USERNAME`}}",
        "opc_password": "{{ env `OPC_PASSWORD`}}",
        "opc_identity_domain": "{{env `OPC_IDENTITY_DOMAIN`}}",
        "opc_api_endpoint": "{{ env `OPC_ENDPOINT`}}"
    "builders": [
            "type": "oracle-classic",
            "username": "{{ user `opc_username`}}",
            "password": "{{ user `opc_password`}}",
            "identity_domain": "{{ user `opc_identity_domain`}}",
            "api_endpoint": "{{ user `opc_api_endpoint`}}",
            "source_image_list": "/Compute-{{ user `opc_identity_domain` }}/{{ user `opc_username`}}/Microsoft_Windows_Server_2012_R2-17.3.6-20170930-124649",
            "attributes_file": "./windows_attributes.json",
            "shape": "oc3",
            "image_name": "Packer_Windows_Demo_{{timestamp}}",
            "dest_image_list": "Packer_Windows_Demo",
            "communicator": "winrm",
            "winrm_username": "Administrator",
            "winrm_password": "password"
    "provisioners": [
          "type": "powershell",
          "inline": "Write-Output(\"HELLO WORLD\")"