diff --git a/experimental/docker-latest-tf/.gitignore b/experimental/docker-latest-tf/.gitignore new file mode 100644 index 0000000000..567609b123 --- /dev/null +++ b/experimental/docker-latest-tf/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/experimental/docker-latest-tf/Dockerfile b/experimental/docker-latest-tf/Dockerfile new file mode 100644 index 0000000000..a780b62352 --- /dev/null +++ b/experimental/docker-latest-tf/Dockerfile @@ -0,0 +1,26 @@ +FROM alpine:3.22 as builder + +RUN ["apk", "add", "jq"] +RUN ["apk", "add", "bash"] + +WORKDIR /build + +COPY ./setup.sh /build/docker/setup.sh +COPY ./config.tfrc /app/config/config.tfrc + +ARG ARCH +ARG CLI_VERSION=0.279.0 +RUN /build/docker/setup.sh + +# Start from a fresh base image, to remove any build artifacts and scripts. +FROM alpine:3.22 + +ENV DATABRICKS_TF_EXEC_PATH "/app/bin/terraform" +ENV DATABRICKS_TF_CLI_CONFIG_FILE "/app/config/config.tfrc" +ENV DATABRICKS_TF_VERSION "1.14.0" +ENV PATH="/app:${PATH}" + +COPY --from=builder /app /app + +ENTRYPOINT ["/app/databricks"] +CMD ["-h"] diff --git a/experimental/docker-latest-tf/README.md b/experimental/docker-latest-tf/README.md new file mode 100644 index 0000000000..4fdf8f8b78 --- /dev/null +++ b/experimental/docker-latest-tf/README.md @@ -0,0 +1,45 @@ +# Docker with Latest Terraform + +Docker image using Terraform 1.14.0 and Databricks CLI v0.279.0. + +## Build + +```bash +./build.sh +``` + +Images are output to `build/` directory. + +## Upload to GitHub Container Registry + +```bash +# Login to ghcr.io +# Provision a token with write packages permissions +echo "GH_TOKEN" | docker login ghcr.io -u --password-stdin + +# Load and tag images +docker load -i build/cli-amd64.tar +docker load -i build/cli-arm64.tar + +# Tag for registry +docker tag databricks-cli:amd64 ghcr.io/databricks/cli:latest-tf-amd64 +docker tag databricks-cli:arm64 ghcr.io/databricks/cli:latest-tf-arm64 + +# Push +docker push ghcr.io/databricks/cli:-amd64-tf--experimental +docker push ghcr.io/databricks/cli:-amd64-tf--experimental + + +## Test + +```bash +# Load the image +docker load -i build/cli-arm64.tar # or cli-amd64.tar + +# Run a bundle deploy (mount your bundle directory and credentials) +docker run --rm \ + -v ~/.databrickscfg:/root/.databrickscfg:ro \ + -v /path/to/your/bundle:/bundle \ + -w /bundle \ + databricks-cli:arm64 bundle deploy +``` diff --git a/experimental/docker-latest-tf/build.sh b/experimental/docker-latest-tf/build.sh new file mode 100755 index 0000000000..dc509fa24d --- /dev/null +++ b/experimental/docker-latest-tf/build.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -euo pipefail + +cd "$(dirname "$0")" + +mkdir -p build + +for arch in amd64 arm64; do + echo "Building for $arch..." + docker build --build-arg ARCH=$arch -t databricks-cli:$arch -f Dockerfile . + docker save databricks-cli:$arch -o build/cli-$arch.tar +done + +echo "Done. Images saved to build/" diff --git a/experimental/docker-latest-tf/config.tfrc b/experimental/docker-latest-tf/config.tfrc new file mode 100644 index 0000000000..123f6d6398 --- /dev/null +++ b/experimental/docker-latest-tf/config.tfrc @@ -0,0 +1,6 @@ +provider_installation { + filesystem_mirror { + path = "/app/providers" + include = ["registry.terraform.io/databricks/databricks"] + } +} diff --git a/experimental/docker-latest-tf/setup.sh b/experimental/docker-latest-tf/setup.sh new file mode 100755 index 0000000000..3d809eef4b --- /dev/null +++ b/experimental/docker-latest-tf/setup.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -euo pipefail + +if [ "$ARCH" != "amd64" ] && [ "$ARCH" != "arm64" ]; then + echo "Unsupported architecture: $ARCH" + exit 1 +fi + +# Download and install the Databricks CLI +mkdir -p /app +wget https://github.com/databricks/cli/releases/download/v${CLI_VERSION}/databricks_cli_${CLI_VERSION}_linux_${ARCH}.tar.gz -O cli.tar.gz +tar -xzf cli.tar.gz -C /app +rm cli.tar.gz + +DATABRICKS_TF_VERSION="1.14.0" +DATABRICKS_TF_PROVIDER_VERSION=$(/app/databricks bundle debug terraform --output json | jq -r .terraform.providerVersion) + +# Download the terraform binary +mkdir -p zip +wget https://releases.hashicorp.com/terraform/${DATABRICKS_TF_VERSION}/terraform_${DATABRICKS_TF_VERSION}_linux_${ARCH}.zip -O zip/terraform.zip + +# Unzip the terraform binary. +unzip zip/terraform.zip -d zip/terraform +mkdir -p /app/bin +mv zip/terraform/terraform /app/bin/terraform + +# Download the provider plugin +TF_PROVIDER_NAME=terraform-provider-databricks_${DATABRICKS_TF_PROVIDER_VERSION}_linux_${ARCH}.zip +mkdir -p /app/providers/registry.terraform.io/databricks/databricks +wget https://github.com/databricks/terraform-provider-databricks/releases/download/v${DATABRICKS_TF_PROVIDER_VERSION}/${TF_PROVIDER_NAME} -O /app/providers/registry.terraform.io/databricks/databricks/${TF_PROVIDER_NAME}