Build and use a custom runner image for TF-Controller
# Using a custom runner image for TF-Controller
In order to build a custom runner image, you need a Dockerfile that extends the base image and that adds Terraform, plus any additional required tooling.
The repository that contains the base images is:
ghcr.io/weaveworks/tf-runner
. All base image tags follow the following format: ${TF_CONTROLLER_VERSION}-base
## Prerequisites
You need Docker and Git to build the image.
## Build the image
1. Create a
Dockerfile
that extends the base image and that adds Terraform, plus any additional required tooling. For example:ARG BASE_IMAGEFROM $BASE_IMAGE
ARG TARGETARCHARG TF_VERSION=1.3.9
# Switch to root to have permissions for operationsUSER root
ADD https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_${TARGETARCH}.zip /terraform_${TF_VERSION}_linux_${TARGETARCH}.zipRUN unzip -q /terraform_${TF_VERSION}_linux_${TARGETARCH}.zip -d /usr/local/bin/ && \ rm /terraform_${TF_VERSION}_linux_${TARGETARCH}.zip && \ chmod +x /usr/local/bin/terraform
# Switch back to the non-root user after operationsUSER 65532:65532
Find the original Dockerfile for the runner here
2. Build the image from the directory containing the
Dockerfile
you created above:export TF_CONTROLLER_VERSION=v0.16.0-rc.3export TF_VERSION=1.3.9export BASE_IMAGE=ghcr.io/weaveworks/tf-runner:${TF_CONTROLLER_VERSION}-baseexport TARGETARCH=amd64export REMOTE_REPO=ghcr.io/my-org/custom-runnnerdocker build \ --build-arg BASE_IMAGE=${BASE_IMAGE} \ --build-arg TARGETARCH=${TARGETARCH} \ --tag my-custom-runner:${TF_CONTROLLER_VERSION} .docker tag my-custom-runner:${TF_CONTROLLER_VERSION} $REMOTE_REPO:${TF_CONTROLLER_VERSION}docker push $REMOTE_REPO:${TF_CONTROLLER_VERSION}
Replace the relevant values above with the corresponding values in your organisation/implementation.
3. Update the
values.runner.image
values in the TF-Controller Helm chart values to point to the new image:values: runner: image: repository: ghcr.io/my-org/custom-runnner tag: v0.16.0-rc.3
4. Commit and push the changes to Git, and confirm that the HelmRelease has been updated:
kubectl get deployments.apps -n flux-system tf-controller -o jsonpath='{.spec.template.spec.containers[*]}' | jq '.env[] | select(.name == "RUNNER_POD_IMAGE")'{ "name": "RUNNER_POD_IMAGE", "value": "ghcr.io/my-org/custom-runner:v0.16.0-rc3"}
### References
A set of GitHub actions in the TF-Controller community repo facilitate a process that's similar to the above, but using GitHub Actions to build and push the image. You can find them
here