diff options
| author | Andrew Brooks <andrewgrantbrooks@gmail.com> | 2023-02-06 12:19:29 -0600 |
|---|---|---|
| committer | github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 2023-03-08 17:55:52 +0000 |
| commit | c296bb99f10966bcf3864a499594e3ac06f0f180 (patch) | |
| tree | bcf7742bd9a76ac135ffce77f6f2311e22cf87da | |
| parent | dockerTools: Specify 'latest' tag for repeated layer test image (diff) | |
| download | nixpkgs-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.nix | 15 |
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 |
