<div dir="ltr"><div dir="ltr">Hi there, let me just share the latest status of reproducible Docker/OCI container image builds with BuildKit: <a href="https://github.com/moby/buildkit">https://github.com/moby/buildkit</a></div><div dir="ltr">(OCI = "Open Container Initiative", not "Oracle Cloud Infrastructure")<br><br>BuildKit v0.11 was released in the last month with very preliminary support for SOURCE_DATE_EPOCH and bit-for-bit reproducible builds:<br><br><font size="1" face="monospace" style="background-color:rgb(255,255,255)" color="#0b5394">```dockerfile<br>FROM debian:bullseye-20230109<br>ARG SOURCE_DATE_EPOCH<br>RUN echo "hello ${SOURCE_DATE_EPOCH}" >/hello<br><br># === Workarounds below will not be needed when <a href="https://github.com/moby/buildkit/pull/3560">https://github.com/moby/buildkit/pull/3560</a> is merged ===<br># Limit the timestamp upper bound to SOURCE_DATE_EPOCH.<br># Workaround for <a href="https://github.com/moby/buildkit/issues/3180">https://github.com/moby/buildkit/issues/3180</a><br>RUN find $( ls / | grep -E -v "^(dev|mnt|proc|sys)$" ) -newermt "@${SOURCE_DATE_EPOCH}" -writable -xdev | xargs touch --date="@${SOURCE_DATE_EPOCH}" --no-dereference<br># Squash the entire stage for resetting the whiteout timestamps.<br># Workaround for <a href="https://github.com/moby/buildkit/issues/3168">https://github.com/moby/buildkit/issues/3168</a><br>FROM scratch<br>COPY --from=0 / /<br>```</font><br><br>Currently, the SOURCE_DATE_EPOCH value is only applied to the timestamps in the image metadata (e.g., the `docker history` timestamps), but not automatically applied to the timestamps of the layered files.<br>So, BuildKit v0.11 still requires a very complex Dockerfile, but this will be significantly simplified when <a href="https://github.com/moby/buildkit/pull/3560">https://github.com/moby/buildkit/pull/3560</a> gets merged.<br><br><br>The above Dockerfile can be deterministically built with the following commands:<br><br><font size="1" face="monospace" color="#0b5394">```bash<br># Make sure to pin the BuildKit version<br>docker run -d --name buildkitd --privileged --restart=always moby/buildkit:v0.11.0<br><br>docker cp buildkitd:/usr/bin/buildctl /usr/local/bin/buildctl<br><br>export BUILDKIT_HOST=docker-container://buildkitd<br><br>SOURCE_DATE_EPOCH=1675298208<br><br># Change to "true" for pushing the image to the registry<br>PUSH=false</font></div><div dir="ltr"><font size="1" face="monospace" color="#0b5394"><br>buildctl build \<br>  --frontend dockerfile.v0 \<br>  --local dockerfile=. \<br>  --local context=. \<br>  --metadata-file metadata.json \<br>  --output type=image,name=<a href="http://example.com/foo:$SOURCE_DATE_EPOCH,buildinfo=false,push=$PUSH">example.com/foo:$SOURCE_DATE_EPOCH,buildinfo=false,push=$PUSH</a> \<br>  --opt build-arg:SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH<br><br># Verify the image digest<br>[ "$(jq -r '."containerimage.digest"' < metadata.json)" = "sha256:b313cd9751ed3e0c3f7185c034fde857302d56642ac5518f1ebbf7fc2e8eed93" ]<br>```<br></font><br>Note that the buildctl CLI does not automatically propagate the $SOURCE_DATE_EPOCH env var to containers. (While the buildx CLI does.)<br>So, the `--opt build-arg:SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH` flag is explicitly required.<br><br>I'll talk further about this at FOSDEM: <a href="https://fosdem.org/2023/schedule/event/container_reproducible_dockerfile/">https://fosdem.org/2023/schedule/event/container_reproducible_dockerfile/</a><br>(Sat 12:55-13:15, Containers devroom, UB2.252A (Lameere))<br><br>My talk will also mention how to pin the apt/dnf/apk/pacman packages with my "repro-get" tool ( <a href="https://github.com/reproducible-containers/repro-get">https://github.com/reproducible-containers/repro-get</a> ).<br><br>Looking forward to meeting you all at FOSDEM.<br><br>Regards,<br>Akihiro Suda<br></div></div>