# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0

# ========================================================================
#
# This Dockerfile contains multiple targets.
# Use 'docker build --target=<name> .' to build one.
# e.g. `docker build --target=release-light .`
#
# All non-dev targets have a PRODUCT_VERSION argument that must be provided
# via --build-arg=PRODUCT_VERSION=<version> when building.
# e.g. --build-arg PRODUCT_VERSION=1.11.2
#
# For local dev and testing purposes, please build and use the `dev` docker image.
#
# ========================================================================


# Development docker image primarily used for development and debugging.
# This image builds from the locally generated binary in ./bin/.
# To generate the local binary, run `make dev`.
FROM docker.mirror.hashicorp.services/alpine:latest as dev

RUN apk add --no-cache git bash openssl ca-certificates

COPY bin/packer /bin/packer

ENTRYPOINT ["/bin/packer"]

# Light docker image which can be used to run the binary from a container.
# This image builds from the locally generated binary in ./bin/, and from CI-built binaries within CI.
# To generate the local binary, run `make dev`.
# This image is published to DockerHub under the `light`, `light-$VERSION`, and `latest` tags.
FROM docker.mirror.hashicorp.services/alpine:latest as release-light

ARG PRODUCT_VERSION
ARG BIN_NAME

# TARGETARCH and TARGETOS are set automatically when --platform is provided.
ARG TARGETOS TARGETARCH

LABEL name="Packer" \
      maintainer="HashiCorp Packer Team <packer@hashicorp.com>" \
      vendor="HashiCorp" \
      version=$PRODUCT_VERSION \
      release=$PRODUCT_VERSION \
      summary="Packer is a tool for creating identical machine images for multiple platforms from a single source configuration." \
      description="Packer is a tool for creating identical machine images for multiple platforms from a single source configuration. Please submit issues to https://github.com/hashicorp/packer/issues"

RUN apk add --no-cache git bash wget openssl gnupg xorriso

COPY dist/$TARGETOS/$TARGETARCH/$BIN_NAME /bin/

ENTRYPOINT ["/bin/packer"]

# Full docker image which can be used to run the binary from a container.
# This image is essentially the same as the `release-light` one, but embeds
# the official plugins in it.
FROM release-light as release-full

# Install the latest version of the official plugins
RUN /bin/packer plugins install "github.com/hashicorp/amazon" && \
    /bin/packer plugins install "github.com/hashicorp/ansible" && \
    /bin/packer plugins install "github.com/hashicorp/azure" && \
    /bin/packer plugins install "github.com/hashicorp/docker" && \
    /bin/packer plugins install "github.com/hashicorp/googlecompute" && \
    /bin/packer plugins install "github.com/hashicorp/qemu" && \
    /bin/packer plugins install "github.com/hashicorp/vagrant" && \
    /bin/packer plugins install "github.com/hashicorp/virtualbox" && \
    /bin/packer plugins install "github.com/hashicorp/vmware" && \
    /bin/packer plugins install "github.com/hashicorp/vsphere"

ENTRYPOINT ["/bin/packer"]

# Set default target to 'dev'.
FROM dev
