From 346996ceecc421577be638b9aac4917925329130 Mon Sep 17 00:00:00 2001 From: Antoine Eiche Date: Mon, 12 Mar 2018 17:06:21 +0100 Subject: [PATCH 1/2] dockerTools: dereference hard links in tar archives This is to improve image creation reproducibility. Since the nar format doesn't support hard link, the tar stream of a layer can be different if a dependency of a layer has been built locally or if it has been fetched from a binary cache. If the dependency has been build locally, it can contain hard links which are encoded in the tar stream. If the dependency has been fetched from a binary cache, the tar stream doesn't contain any hard link. So even if the content is the same, tar streams are different. --- pkgs/build-support/docker/default.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix index c40b096e2088..328419d639f9 100644 --- a/pkgs/build-support/docker/default.nix +++ b/pkgs/build-support/docker/default.nix @@ -212,7 +212,7 @@ rec { postMount = '' echo "Packing raw image..." - tar -C mnt --mtime="@$SOURCE_DATE_EPOCH" -cf $out . + tar -C mnt --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" -cf $out . ''; }; @@ -277,7 +277,7 @@ rec { # Tar up the layer and throw it into 'layer.tar'. echo "Packing layer..." mkdir $out - tar -C layer --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf $out/layer.tar . + tar -C layer --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf $out/layer.tar . # Compute a checksum of the tarball. echo "Computing layer checksum..." @@ -359,7 +359,7 @@ rec { echo "Packing layer..." mkdir $out - tar -C layer --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . + tar -C layer --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . # Compute the tar checksum and add it to the output json. echo "Computing checksum..." @@ -489,7 +489,7 @@ rec { comm <(sort -n baseFiles|uniq) \ <(sort -n layerFiles|uniq|grep -v ${layer}) -1 -3 > newFiles # Append the new files to the layer. - tar -rpf temp/layer.tar --mtime="@$SOURCE_DATE_EPOCH" \ + tar -rpf temp/layer.tar --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" \ --owner=0 --group=0 --no-recursion --files-from newFiles echo "Adding meta..." @@ -537,7 +537,7 @@ rec { chmod -R a-w image echo "Cooking the image..." - tar -C image --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'./':: -c . | pigz -nT > $out + tar -C image --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'./':: -c . | pigz -nT > $out echo "Finished." ''; From ac0c491836a835c43641989ccb4b95a172749806 Mon Sep 17 00:00:00 2001 From: Antoine Eiche Date: Mon, 12 Mar 2018 18:26:15 +0100 Subject: [PATCH 2/2] dockerTools: add --sort=name options on all tar calls This is to go to a reproducible image build. Note without this options image are identical from the Docker point of view but generated docker archives could have different hashes. --- pkgs/build-support/docker/default.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix index 328419d639f9..653a651df7bd 100644 --- a/pkgs/build-support/docker/default.nix +++ b/pkgs/build-support/docker/default.nix @@ -212,7 +212,7 @@ rec { postMount = '' echo "Packing raw image..." - tar -C mnt --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" -cf $out . + tar -C mnt --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" -cf $out . ''; }; @@ -277,7 +277,7 @@ rec { # Tar up the layer and throw it into 'layer.tar'. echo "Packing layer..." mkdir $out - tar -C layer --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf $out/layer.tar . + tar -C layer --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf $out/layer.tar . # Compute a checksum of the tarball. echo "Computing layer checksum..." @@ -359,7 +359,7 @@ rec { echo "Packing layer..." mkdir $out - tar -C layer --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . + tar -C layer --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . # Compute the tar checksum and add it to the output json. echo "Computing checksum..." @@ -489,7 +489,7 @@ rec { comm <(sort -n baseFiles|uniq) \ <(sort -n layerFiles|uniq|grep -v ${layer}) -1 -3 > newFiles # Append the new files to the layer. - tar -rpf temp/layer.tar --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" \ + tar -rpf temp/layer.tar --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" \ --owner=0 --group=0 --no-recursion --files-from newFiles echo "Adding meta..." @@ -537,7 +537,7 @@ rec { chmod -R a-w image echo "Cooking the image..." - tar -C image --hard-dereference --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'./':: -c . | pigz -nT > $out + tar -C image --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'./':: -c . | pigz -nT > $out echo "Finished." '';