You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Star0Β (0)You must be signed in to star a repository
About
Minimal, non-root Go container images (1.27, 1.26, 1.25; runtime and dev) for amd64 and arm64, built with apko on Wolfi. Rebuilt when packages change; every release tested, scanned with OpenSCAP against a DISA GPOS SRG-derived profile and with Grype, signed with Sigstore, with SBOMs and SLSA L3 provenance.
Minimal, non-root Go container images for linux/amd64 and linux/arm64, built with
apko from Wolfi packages and
verified upstream binaries. Every image is rebuilt every two hours and published again only when its content changed. Every version is:
tested on both architectures with functional, compiler and CGO integration checks;
scanned with OpenSCAP against a hardening profile derived from the DISA General Purpose
Operating System SRG, and for known vulnerabilities with Grype;
signed keyless with Sigstore;
attested with its SBOM, its scan results and SLSA Build Level 3 provenance.
These images ship Go and its toolchain. Cryptography profiles (for example FIPS 140-3) are
chosen per application and per contract, and are provided separately: see Cryptography.
Alignment at a glance
Area
Aligned with
Evidence in every release
Hardening
OpenSCAP profile derived from the DISA General Purpose Operating System SRG (not an official DISA STIG for containers)
Rules passed out of the applicable ones (about 94% on go:1.25), the full report, a signed attestation; see Security scans
ghcr.io/pair-ai-platform/go:<tag>. The numbers come from the newest release of each image
and update with every release; click a badge for the details on the image's page:
Hardening profile: rules passed out of the applicable ones, with the full OpenSCAP report.
Vulnerabilities: counts by severity (Critical / High / Medium / Low); the page lists every
CVE with the affected package and the version that fixes it.
SBOM: packages on amd64 / arm64; the page lists every package with its version and license,
and links each architecture's SPDX file.
Size: compressed. Each image's GitHub releases have the same numbers for both
architectures, plus what changed.
Image
Go line
Hardening profile (x86_64)
Vulnerabilities
SBOM
Size
Newest release
go:1.27 Β· latest
Current stable runtime
go:1.27-dev Β· latest-dev
Current stable development (CGO)
go:1.26
Active stable runtime
go:1.26-dev
Active stable development (CGO)
go:1.25
Extended maintenance (LTS) runtime
go:1.25-dev
Extended maintenance (LTS) development
Go 1.27 is the current stable release, and Go 1.26 is the active maintenance release, both built natively from Wolfi packages.
Go 1.25 is our designated extended maintenance (LTS) line. Because Chainguard moved Go 1.25 to its commercial/enterprise
repository, the public Wolfi repository stopped updating it. We build our Go 1.25 images equivalent
to Chainguard's Go images directly from the official go.dev binaries, cryptographically verified with
Google's Linux Packages Signing Authority PGP key and SHA-256 checksums; see Where Go comes from.
Flavor
Contents
runtime (go:1.25)
Go compiler and toolchain, git, bash, busybox, CA certificates, and time zones. Runs as nonroot (1000:1000) in /app. Minimal attack surface without C compiler tooling.
development (go:1.25-dev)
The standard runtime plus build-base (GCC, G++, make, binutils), pkgconf, Python 3, and OpenSSH client for CGO compilation and native C library dependencies.
# Multi-stage build exampleFROM ghcr.io/pair-ai-platform/go:1.25-dev AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /app/server ./cmd/server
# Ship on minimal runtime or distrolessFROM ghcr.io/pair-ai-platform/go:1.25
COPY --from=build /app/server /app/server
ENTRYPOINT ["/app/server"]
The default entrypoint is /usr/bin/go. Running docker run ghcr.io/pair-ai-platform/go:1.25 version
executes go version. For shell interaction, override entrypoint with --entrypoint bash.
Tags and versions
Tag
Example
Moves?
Release
1.25.12-20261109.1, 1.25.12-dev-20261109.1
Never. One per published version, with its own GitHub release
Patch
1.25.12, 1.25.12-dev
To the newest release of that Go patch release
Minor and major
1.25, 1.25-dev
To the newest release of that line
latest, latest-dev
To the newest release of the LTS line (1.25)
Every run takes each image through these steps; a version exists for users only after the last one:
Step
What happens
If it fails
1. Build and test
apko builds the image natively on x86_64 and aarch64; functional, compiler, CGO, hardening-profile and vulnerability scans run on each
Nothing is published
2. Compare
Both architectures are built together; each must be byte for byte the image tested in step 1. If the result equals the image under the floating tag (1.25), nothing changed and the run stops here for that image
Nothing is published
3. Publish by digest
The image is pushed to GHCR without any tag
Untagged, invisible to users; the cleanup deletes it
4. Sign, attest, verify
Sigstore signatures; SBOM, hardening-profile, vulnerability and SLSA provenance attestations; all verified
Still untagged
5. Tag
The release tag (1.25.12-20261109.1) and the floating tags move to the new digest
A re-run of the failed job tags it
6. Release
A GitHub release with the changes, the scan results, the SBOMs and the OpenSCAP report, created only if the tag exists on that digest; the badges are updated
A re-run of the failed job creates it
7. Keep ten
The ten newest versions of each image stay, in GHCR and as GitHub releases
Never fails a release; runs again next time
Only changed images are published. The builds are reproducible: the same packages give the
same digest. An hourly check starts a build as soon as Wolfi ships a new version of something
inside an image, and the build publishes only the images whose digest changed.
Release tags never move and never point to an image without its evidence. Floating tags
always point to a kept, signed version.
Retention: ten versions per image. GHCR and the GitHub releases keep the ten newest versions
of each image (1.25, 1.25-dev).
The evidence outlives the image. For every version ever published, release records, SBOMs and
OpenSCAP reports are preserved in GitHub Pages archive and Rekor.
Security scans
Hardening profile (OpenSCAP, DISA GPOS SRG)
This is not an official DISA STIG for containers: DISA publishes none. Each image is scanned on both
architectures with OpenSCAP against the content that Wolfi
publishes in the chainguard-security-guide package (Apache-2.0): the xccdf_basic_profile_.check
profile of ssg-chainguard-gpos-ds.xml, which is based on the DISA General Purpose Operating System
SRG. The scanner is built from the Wolfi packages openscap and chainguard-security-guide.
A typical run on go:1.25 passes over 93% of applicable rules. The rules that do not pass,
and why:
actions/attest-build-provenance records the source commit, workflow, inputs and runner for every published image
Provenance is authentic
Signed through Sigstore with the build workflow's OIDC identity and logged in Rekor; checked again before the image is tagged
Hosted, ephemeral build platform
GitHub-hosted runners: ubuntu-24.04 (x86_64) and ubuntu-24.04-arm (aarch64), with no emulation
Isolated build, provenance not forgeable by it
Building, signing and attesting run inside the reusable workflow .github/workflows/build.yml, whose identity signs the provenance; callers can only pass publish: true/false
Not pinned. Every hour, wolfi-watch.yml resolves which Wolfi versions each image would get; as soon as anything changes, it starts the release. The build every two hours stays as a safety net
apko, OpenSCAP and Grype images, oras, cosign, GitHub Actions
Pinned by digest or version. Renovate opens a pull request, automerged once tests pass
Go 1.25 (official go.dev binaries)
Renovate tracks go.dev releases; pull requests automerge after images build and test (details)
A new Go line
Add apko/go-<version>.apko.yaml and -dev.apko.yaml
Build locally
Needs Docker, curl and cosign. Tools come from their GitHub releases, verified.
Minimal, non-root Go container images (1.27, 1.26, 1.25; runtime and dev) for amd64 and arm64, built with apko on Wolfi. Rebuilt when packages change; every release tested, scanned with OpenSCAP against a DISA GPOS SRG-derived profile and with Grype, signed with Sigstore, with SBOMs and SLSA L3 provenance.