A secure, lightweight, and production-ready Wolfi-based for modern Terraform and DevOps workflows.
10K+
A reproducible, audit-ready Terraform toolchain for teams that deliver on AWS, Azure and Kubernetes.
Toolchain drift costs infrastructure teams hours each week: the wrong Terraform version, a missing scanner, a CI job that differs from the laptop. This image gives every engineer, every CI runner and every HITL review the same verified binaries. Pin it by digest and the toolchain cannot change under you.
| Tag | Use it for |
|---|---|
aws, <version>-aws | AWS delivery in CI and in the delivery plugin |
<version>-slim, slim | Hybrid-cloud devcontainer, no browser. tfsec was removed in 2.11.0; use trivy (iacscan) |
<version>, latest | Devcontainer with Playwright and Chromium |
Pin the multi-arch index digest: nnthanh101/terraform:<version>-aws@sha256:<digest>.
The aws tag leaves out the vendor coding CLI, model SDKs, Azure CLI, Ansible, Vault, Atlantis, ngrok, k3d, nginx, Go and Playwright.
Every tag is built for linux/amd64 and linux/arm64. Measured on 2026-09-23, the aws tag is about 0.4 GB to pull.
All versions come from .devcontainer/versions.env. Renovate proposes updates each week, after a 7-day waiting period.
Image version: 2.11.0 (from .devcontainer/terraform/VERSION).
| Tool | aws | slim | full | Version |
|---|---|---|---|---|
| Terraform | ✓ | ✓ | ✓ | 1.16.3 |
| Terraform (previous line) | ✓ | ✓ | 1.15.9 | |
| AWS CLI v2 | ✓ | ✓ | ✓ | Wolfi |
| GitHub CLI (gh) | ✓ | ✓ | ✓ | 2.101.0 |
| tflint | ✓ | ✓ | ✓ | 0.64.0 |
| tflint-ruleset-aws | ✓ | ✓ | ✓ | 0.49.0 |
| trivy | ✓ | ✓ | ✓ | 0.74.0 |
| checkov | ✓ | ✓ | ✓ | 3.3.19 |
| infracost | ✓ | ✓ | ✓ | 0.10.45 |
| terraform-docs | ✓ | ✓ | ✓ | 0.24.0 |
| cosign | ✓ | ✓ | ✓ | 3.1.3 |
| terraform-mcp-server | ✓ | ✓ | ✓ | 1.3.0 |
| task | ✓ | 3.53.1 | ||
| Python | ✓ | 3.14 | ||
| Terragrunt | ✓ | ✓ | 1.1.6 | |
| AWS CDK | ✓ | ✓ | 2.1142.0 | |
| k3d | ✓ | ✓ | 5.9.0 | |
| Vault | ✓ | ✓ | 2.1.1 | |
| Atlantis | ✓ | ✓ | 0.48.0 |
Base image (every target): cgr.dev/chainguard/wolfi-base:latest@sha256:1d95114038f76513a9ace6fca107d5582b08c65981f81f61cb56bf7fd2ef216d
Wolfi = the signed Wolfi package, updated weekly. slim and full also carry task and Python from Wolfi. trivy is the cosign-verified release binary; checkov on aws is installed from a hash-locked lock file.
docker run --rm --read-only --tmpfs /tmp --user "$(id -u):$(id -g)" -e HOME=/tmp \
-v "$PWD:/workspace" -w /workspace \
nnthanh101/terraform:aws terraform version
Pin what you tested. This prints the digest to use as nnthanh101/terraform@sha256:<digest>:
docker buildx imagetools inspect nnthanh101/terraform:aws --format '{{json .Manifest.Digest}}'
GitHub Actions job:
jobs:
plan:
runs-on: ubuntu-latest
container:
image: nnthanh101/terraform:<version>-aws@sha256:<digest>
options: --user 0 # prevents EACCES on the runner's temporary directories
steps:
- uses: actions/checkout@<commit-sha> # pin actions by commit
- run: terraform init && terraform plan
.github/workflows/docker-release-terraform.yml on main is signed keylessly with cosign. A digest published from a workstation with task docker:publish passes the same gate but is not signed; pin a signed digest for releases.trivyignore.yaml (90 days or less; the 2.11.0 entries expire on 2026-12-22), and the gate fails again on expiry.os (UID 11111).Verify a CI release before use (a digest published from a workstation is not signed, so this fails for it):
digest=$(docker buildx imagetools inspect nnthanh101/terraform:aws --format '{{json .Manifest.Digest}}' | tr -d '"')
cosign verify \
--certificate-identity-regexp '^https://github.com/1xOps/adlc-framework/.github/workflows/docker-release-' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
"nnthanh101/terraform@$digest"
Content type
Image
Digest
sha256:e6cebcca6…
Size
1.7 GB
Last updated
3 days ago
docker pull nnthanh101/terraform