Built from main at 1d902a0 on 2026-11-14

Docker

A format: Dockerfiles, recognised by name (Dockerfile, Containerfile, Dockerfile.<stage>) or by suffix (<name>.Dockerfile, <name>.dockerfile). A Dockerfile is not a program, so nothing about toolchains, tests or coverage applies; what is asked of it is hygiene. Compose files are YAML, and the Data format's. A CI job works with the ecosystem when it builds an image (docker build, docker buildx build, podman build, buildah, docker/build-push-action) or runs one of the tools below.

data-wellformed

Every Dockerfile parses: it has instructions, each a known one (FROM, RUN, COPY, ARG, …) with arguments, and the first instruction that is not an ARG is a FROM. Comments, line continuations (with the character the # escape= directive sets), and heredocs (RUN <<EOF … EOF) are read as BuildKit reads them.

static-analysis

hadolint (hadolint Dockerfile, or hadolint/hadolint-action), with its settings in .hadolint.yaml or the file --config names. The misconfiguration scanners count too: checkov, trivy config (or a trivy fs whose --scanners include misconfigurations), KICS.

security-scanning

hadolint's security rules (a non-root USER, pinned versions, no latest tag), or one of the misconfiguration scanners: checkov (bridgecrewio/checkov-action), trivy config (aquasecurity/trivy-action with scan-type: config), KICS (checkmarx/kics-github-action).

dependency-audit

CI scans the image it builds for vulnerable packages: trivy image <image> (or aquasecurity/trivy-action, which scans an image unless told otherwise), grype <image> (or anchore/scan-action), docker scout cves <image> (or docker/scout-action).

Not judged

Whether CI builds the image, or smoke-tests it (container-structure-test), is not a tests-run for a format; whether .dockerignore exists is not a vcs-ignore; and whether base images are pinned by digest is a dependency rule (#24) a later check asks. The other checks have no tool for Dockerfiles and are skipped.