Skip to main content

Docker / Containers

Location: examples/docker/

Container images embed version info in two places:

  1. The binary inside (using the language-specific approach)
  2. OCI image labels (for image inspection without running)
examples/docker/Dockerfile
# Build arguments
ARG VERSION=dev
ARG GIT_COMMIT=unknown
ARG BUILD_DATE=unknown

FROM golang:1.21-alpine AS builder

ARG VERSION
ARG GIT_COMMIT
ARG BUILD_DATE

WORKDIR /app
COPY . .

# Inject version at compile time
RUN go build -ldflags "\
-X main.Version=${VERSION} \
-X main.GitCommit=${GIT_COMMIT} \
-X main.BuildDate=${BUILD_DATE}" \
-o /app/sample-app

FROM alpine:3.19

ARG VERSION
ARG GIT_COMMIT
ARG BUILD_DATE

# OCI Image Labels
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.revision="${GIT_COMMIT}"
LABEL org.opencontainers.image.created="${BUILD_DATE}"

COPY --from=builder /app/sample-app /usr/local/bin/sample-app

ENTRYPOINT ["sample-app"]
examples/docker/Makefile (excerpt)
docker-build:
VERSION=$$(versionator version); \
COMMIT=$$(versionator output version -t "{{ShortHash}}"); \
DATE=$$(versionator output version -t "{{BuildDateTimeUTC}}"); \
docker build \
--build-arg VERSION=$$VERSION \
--build-arg GIT_COMMIT=$$COMMIT \
--build-arg BUILD_DATE=$$DATE \
-t sample-app:$$VERSION .

Run it

$ cd examples/docker && just show-version
Version from versionator:
VERSION=0.0.16
GIT_COMMIT=ba4ecb3
BUILD_DATE=2026-03-08T18:52:29Z

$ just docker-build
Building Docker image with:
VERSION=0.0.16
GIT_COMMIT=ba4ecb3
BUILD_DATE=2026-03-08T18:52:29Z
...

$ just docker-run
Running sample-app:0.0.16
Sample Docker Application
Version: 0.0.16 (commit: ba4ecb3, built: 2026-03-08T18:52:29Z)

Source Code