aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh')
-rwxr-xr-xnixpkgs/pkgs/build-support/docker/store-path-to-layer.sh37
1 files changed, 32 insertions, 5 deletions
diff --git a/nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh b/nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh
index bcad9e83e06..c808abab7a8 100755
--- a/nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh
+++ b/nixpkgs/pkgs/build-support/docker/store-path-to-layer.sh
@@ -5,16 +5,43 @@ set -eu
layerNumber=$1
shift
+storePath="$1"
+shift
+
layerPath="./layers/$layerNumber"
-echo "Creating layer #$layerNumber for $@"
+echo "Creating layer #$layerNumber for $storePath"
mkdir -p "$layerPath"
-tar --no-recursion -rf "$layerPath/layer.tar" \
+
+# Make sure /nix and /nix/store appear first in the archive.
+# We create the directories here and use them because
+# when there are other things being added to the
+# nix store, tar could fail, saying,
+# "tar: /nix/store: file changed as we read it"
+mkdir -p nix/store
+tar -cf "$layerPath/layer.tar" \
--mtime="@$SOURCE_DATE_EPOCH" \
- --owner=0 --group=0 /nix /nix/store
-tar -rpf "$layerPath/layer.tar" --hard-dereference --sort=name \
+ --owner=0 --group=0 \
+ --transform='s,nix,/nix,' \
+ nix
+
+# We change into the /nix/store in order to avoid a similar
+# "file changed as we read it" error as above. Namely,
+# if we use the absolute path of /nix/store/123-pkg
+# and something new is added to the nix store while tar
+# is running, it will detect a change to /nix/store and
+# fail. Instead, if we cd into the nix store and copy
+# the relative nix store path, tar will ignore changes
+# to /nix/store. In order to create the correct structure
+# in the tar file, we transform the relative nix store
+# path to the absolute store path.
+n=$(basename "$storePath")
+tar -C /nix/store -rpf "$layerPath/layer.tar" \
+ --hard-dereference --sort=name \
--mtime="@$SOURCE_DATE_EPOCH" \
- --owner=0 --group=0 "$@"
+ --owner=0 --group=0 \
+ --transform="s,$n,/nix/store/$n," \
+ $n
# Compute a checksum of the tarball.
tarhash=$(tarsum < $layerPath/layer.tar)