mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-29 09:04:17 +00:00
35 lines
1.1 KiB
Nix
35 lines
1.1 KiB
Nix
|
{
|
||
|
lib,
|
||
|
runCommand,
|
||
|
jq,
|
||
|
}:
|
||
|
{
|
||
|
maxLayers,
|
||
|
fromImage ? null,
|
||
|
}:
|
||
|
runCommand "popularity-contest-layering-pipeline.json" { inherit maxLayers; } ''
|
||
|
# Compute the number of layers that are already used by a potential
|
||
|
# 'fromImage' as well as the customization layer. Ensure that there is
|
||
|
# still at least one layer available to store the image contents.
|
||
|
# one layer will be taken up by the customisation layer
|
||
|
usedLayers=1
|
||
|
|
||
|
${lib.optionalString (fromImage != null) ''
|
||
|
# subtract number of base image layers
|
||
|
baseImageLayersCount=$(tar -xOf "${fromImage}" manifest.json | ${lib.getExe jq} '.[0].Layers | length')
|
||
|
|
||
|
(( usedLayers += baseImageLayersCount ))
|
||
|
''}
|
||
|
|
||
|
if ! (( $usedLayers < $maxLayers )); then
|
||
|
echo >&2 "Error: usedLayers $usedLayers layers to store 'fromImage' and" \
|
||
|
"'extraCommands', but only maxLayers=$maxLayers were" \
|
||
|
"allowed. At least 1 layer is required to store contents."
|
||
|
exit 1
|
||
|
fi
|
||
|
availableLayers=$(( maxLayers - usedLayers ))
|
||
|
|
||
|
# Produce pipeline which uses popularity_contest algo.
|
||
|
echo '[["popularity_contest"],["limit_layers",'$availableLayers']]' > $out
|
||
|
''
|