forked from mirrors/nixpkgs
886c92332c
In https://github.com/NixOS/nixpkgs/pull/58431 the authors ensured that the resulting layer.tar would always list /nix/ /nix/store/ first to fully comply to the tar spec. Various refactorings later it is only ensured to create /nix/ but NOT /nix/store anymore. Instead tar transformed them to /nix/nix and /nix/nix/store.
51 lines
1.6 KiB
Bash
Executable file
51 lines
1.6 KiB
Bash
Executable file
#!@shell@
|
|
|
|
set -eu
|
|
|
|
layerNumber=$1
|
|
shift
|
|
|
|
layerPath="./layers/$layerNumber"
|
|
echo "Creating layer #$layerNumber for $@"
|
|
|
|
mkdir -p "$layerPath"
|
|
|
|
# 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
|
|
|
|
# Then 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.
|
|
tarhash=$(
|
|
basename -a "$@" |
|
|
tar --create --preserve-permissions --absolute-names nix \
|
|
--directory /nix/store --verbatim-files-from --files-from - \
|
|
--hard-dereference --sort=name \
|
|
--mtime="@$SOURCE_DATE_EPOCH" \
|
|
--owner=0 --group=0 \
|
|
--transform 's,^nix$,/\0,' \
|
|
--transform 's,^nix/store$,/\0,' \
|
|
--transform 's,^[^/],/nix/store/\0,rS' |
|
|
tee "$layerPath/layer.tar" |
|
|
tarsum
|
|
)
|
|
|
|
# Add a 'checksum' field to the JSON, with the value set to the
|
|
# checksum of the tarball.
|
|
cat ./generic.json | jshon -s "$tarhash" -i checksum > $layerPath/json
|
|
|
|
# Indicate to docker that we're using schema version 1.0.
|
|
echo -n "1.0" > $layerPath/VERSION
|