fix(supply-chain): pin Dockerfile base images by digest - #216
Closed
seonghobae wants to merge 5 commits into
Closed
Conversation
Contributor
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This was referenced Aug 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
Advance #215 / #165 from exact protected
develop@622e5e6c3d534f230c390f10e3832efadfc01825with one bounded container-build input-integrity slice. ProtectedDockerfileused mutable tag-only Maven/Temurin base images, so the same protected source could resolve to different upstream bytes without a mightyETL commit.This remains a direct-
developDraft. It changes only production Dockerfile base-image identity, one focused repository-policy test, source-local supply-chain doctoring andCHANGELOG.md. It does not create a release workflow, alter Compose/.dockerignore, service behavior, Java/Maven version intent, runtime user, entrypoint, credentials, or canonical #149 documentation.Exact current identity
develop@622e5e6c3d534f230c390f10e3832efadfc01825;security/pin-docker-base-digests-622e5e6;d94c27578017a030c56547bd4285de3e2ee3436c;f1fd9eec5f6d7eded25cb27ab2ec6a0916577d4b;7c1ca42e260c9fe442eb6a1ea7224027ea1a3d7e;60ca61b36df9e61e7bd2721e165e3959f969d23e;884b9c78ea02892a078ecf2cdf6b8b22d192c2f4;Every check/review from a predecessor source head is historical after movement.
RCA
FROMinstructions used tags without@sha256:.RED 1 — hosted production-Dockerfile proof
d94c27578017a030c56547bd4285de3e2ee3436cadded onlyRepositoryDockerBaseImagePolicyTest. It parses every real external root-DockerfileFROMand requires an explicit readable non-latesttag plus a full lowercasesha256:<64 hex>digest.CI
31364843626, macOS job93380916213, checked out synthetic merge7780796b88e4c96b35d594b6fe0984deb5aaff7f. Production/test compilation was healthy and ETL ran 276 tests with exactly one failure, zero errors/skips:everyExternalDockerBaseImageKeepsReadableTagAndPinsFullSha256Digest, on the tag-only Maven image. This is valid RED at the intended production-Dockerfile boundary, not setup/import/fixture/dependency failure.GREEN 1 — immutable image input
Immediately before the production mutation, the PR head, protected base, Dockerfile blob and current official Docker Hub tag evidence were re-read. The exact declared tags resolved to the reviewed multi-platform index digests:
maven:3.9.13-eclipse-temurin-25→sha256:ade3c87e3cdfbe04932afa16b31814cbf60b0122d21d78a76530684a1eeb7cc2;eclipse-temurin:25-jre→sha256:681c543d6f36c50f45e9b5226930a46203dcfa351d3670e9d0bdf0dabae53539.f1fd9eec5f6d7eded25cb27ab2ec6a0916577d4bchanged only the twoFROMlines totag@sha256:index-digest; Maven/JDK/JRE tag intent, stages, build command, non-root runtime user and entrypoint remained unchanged. Hosted CI31365172201then succeeded across macOS/Ubuntu/Windows, including the new Dockerfile test, while full ETL/CDC/gateway suites were green.RED 2 → GREEN 2 — source-backed update/recovery authority
After behavior GREEN,
7c1ca42e260c9fe442eb6a1ea7224027ea1a3d7echanged only the test contract to requiredocs/doctoring/docker-base-image-digest-pinning.mdplus a discoverable CHANGELOG entry. CI31365421591, macOS job93382649010, compiled production/tests successfully and ran ETL 277 tests with exactly one failure, zero errors/skips because the doctoring artifact was absent. The original Dockerfile digest assertion remained green. This is valid documentation RED.Exact current source
60ca61b36df9e61e7bd2721e165e3959f969d23enow records:UnreleasedCHANGELOG entry for digest-pinned Docker base images.Exact-current-head hosted evidence
All exposed workflow aggregates associated with exact source head
60ca61b36df9e61e7bd2721e165e3959f969d23eare terminal-success:31365735134: success on Ubuntu, macOS and Windows;31365735174: success;31365735125: success;31365735194: success;31365735151: aggregate success.CI macOS job
93383586833checked out synthetic merge884b9c78ea02892a078ecf2cdf6b8b22d192c2f4, not literal source head.RepositoryDockerBaseImagePolicyTestpassed 2/2; ETL ran 277/277 green, CDC 106/106 green, gateway 3/3 green, and the full reactor completedBUILD SUCCESS.The same CI log still reports
Analyzed bundle 'etl-service' with 0 classesbefore declaring JaCoCo success. #162/#164 owns selected-class non-vacuity and #205 owns repository-wide production coverage scope. This aggregate is therefore not accepted 100% owned-production coverage evidence.Hard Trivy job
93383587126likewise checked out synthetic merge884b9c78..., not literal source, and printedDependency version cannot be determined. Child dependencies will not be found.before producing a zero-findings SARIF. #196 owns scanner dependency-graph completeness. It also continues to encounter the tracked 82 MBzipkin.jar, separately owned by #168/#169. Aggregate Security Scan success is therefore not accepted as complete release/merge security evidence.The current reactor also reproduces a separate platform-dependent Maven resource-encoding warning; issue #217 now owns that reproducibility gap and explicitly defers root-POM mutation while #160 owns the current
pom.xmlwriter lane.Primary references
Docker. (2026). Building best practices. https://docs.docker.com/build/building/best-practices/
Docker. (2026). Dockerfile reference. https://docs.docker.com/reference/dockerfile/
Docker. (2026). Image digests. https://docs.docker.com/dhi/core-concepts/digests/
Merge boundary
Keep Draft. Digest pinning is one supply-chain input control; it does not establish byte-for-byte final-image reproducibility, release provenance, licensing/NOTICE rights, literal-source acceptance, complete scanner dependency resolution, non-vacuous coverage or independent approval. Merge only when the unchanged exact source head satisfies live repository/CWL policy, accepted literal-source deterministic/security evidence, complete same-revision dependency/SBOM/vulnerability evidence, applicable non-vacuous owned-production coverage, zero valid unresolved findings, qualifying independent non-author formal approval where required, and branch protection/rulesets permit expected-head merge. No predecessor-head, incomplete-scanner, skipped-required, status-only or synthetic-only evidence transfers.