summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Brooks <andrewgrantbrooks@gmail.com>2023-02-06 12:19:29 -0600
committergithub-actions[bot] <github-actions[bot]@users.noreply.github.com>2023-03-08 17:55:52 +0000
commitc296bb99f10966bcf3864a499594e3ac06f0f180 (patch)
treebcf7742bd9a76ac135ffce77f6f2311e22cf87da
parentdockerTools: Specify 'latest' tag for repeated layer test image (diff)
downloadnixpkgs-origin/backport-214438-to-release-22.11.tar.gz
dockerTools: Preprocess layers list before unpack to handle repeated layersorigin/backport-214438-to-release-22.11
(cherry picked from commit 84e04ccf8570e9f8072486f7d750d326225c7117)
-rw-r--r--pkgs/build-support/docker/default.nix15
1 files changed, 12 insertions, 3 deletions
diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix
index 1feecc915e90..f3097c283cf4 100644
--- a/pkgs/build-support/docker/default.nix
+++ b/pkgs/build-support/docker/default.nix
@@ -228,6 +228,15 @@ rec {
mount /dev/${vmTools.hd} disk
cd disk
+ function dedup() {
+ declare -A seen
+ while read ln; do
+ if [[ -z "''${seen["$ln"]:-}" ]]; then
+ echo "$ln"; seen["$ln"]=1
+ fi
+ done
+ }
+
if [[ -n "$fromImage" ]]; then
echo "Unpacking base image..."
mkdir image
@@ -244,7 +253,8 @@ rec {
parentID="$(cat "image/manifest.json" | jq -r '.[0].Config | rtrimstr(".json")')"
fi
- cat ./image/manifest.json | jq -r '.[0].Layers | .[]' > layer-list
+ # In case of repeated layers, unpack only the last occurrence of each
+ cat ./image/manifest.json | jq -r '.[0].Layers | .[]' | tac | dedup | tac > layer-list
else
touch layer-list
fi
@@ -258,14 +268,13 @@ rec {
mkdir -p image/$extractionID/layer
tar -C image/$extractionID/layer -xpf image/$layerTar
+ rm image/$layerTar
find image/$extractionID/layer -name ".wh.*" -exec bash -c 'name="$(basename {}|sed "s/^.wh.//")"; mknod "$(dirname {})/$name" c 0 0; rm {}' \;
# Get the next lower directory and continue the loop.
lowerdir=image/$extractionID/layer''${lowerdir:+:}$lowerdir
done
- # Don't remove tarballs until all unpacked in case some are used more than once
- awk '{print "image/"$0}' layer-list | xargs rm -f
mkdir work
mkdir layer