forked from mirrors/nixpkgs
3b65b3f6d6
Fixes #78744 My previous change broke when there are more packages than the maximum number of layers. I had assumed that the `store-path-to-layer.sh` was only ever passed a single store path, but that is not the case if there are multiple packages going into the final layer. To fix this, we loop through the paths going into the final layer, appending them to the tar file and making sure they end up at the right path.
54 lines
1.6 KiB
Bash
Executable file
54 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
|
|
tar -cf "$layerPath/layer.tar" \
|
|
--mtime="@$SOURCE_DATE_EPOCH" \
|
|
--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.
|
|
for storePath in "$@"; do
|
|
n=$(basename "$storePath")
|
|
tar -C /nix/store -rpf "$layerPath/layer.tar" \
|
|
--hard-dereference --sort=name \
|
|
--mtime="@$SOURCE_DATE_EPOCH" \
|
|
--owner=0 --group=0 \
|
|
--transform="s,$n,/nix/store/$n," \
|
|
$n
|
|
done
|
|
|
|
# Compute a checksum of the tarball.
|
|
tarhash=$(tarsum < $layerPath/layer.tar)
|
|
|
|
# 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
|