diff options
-rw-r--r-- | nixos/tests/docker-tools.nix | 6 | ||||
-rw-r--r-- | pkgs/build-support/docker/examples.nix | 12 | ||||
-rwxr-xr-x | pkgs/build-support/docker/store-path-to-layer.sh | 21 |
3 files changed, 28 insertions, 11 deletions
diff --git a/nixos/tests/docker-tools.nix b/nixos/tests/docker-tools.nix index 07fac533680..ca750e8ba3c 100644 --- a/nixos/tests/docker-tools.nix +++ b/nixos/tests/docker-tools.nix @@ -83,5 +83,11 @@ import ./make-test.nix ({ pkgs, ... }: { # Ensure image with only 2 layers can be loaded $docker->succeed("docker load --input='${pkgs.dockerTools.examples.two-layered-image}'"); + + # Ensure the bulk layer didn't miss store paths + # Regression test for https://github.com/NixOS/nixpkgs/issues/78744 + $docker->succeed("docker load --input='${pkgs.dockerTools.examples.bulk-layer}'"); + # This ensure the two output paths (ls and hello) are in the layer + $docker->succeed("docker run bulk-layer ls /bin/hello"); ''; }) diff --git a/pkgs/build-support/docker/examples.nix b/pkgs/build-support/docker/examples.nix index a1f71d35793..f0dcf236c0e 100644 --- a/pkgs/build-support/docker/examples.nix +++ b/pkgs/build-support/docker/examples.nix @@ -246,4 +246,16 @@ rec { contents = [ pkgs.bash pkgs.hello ]; maxLayers = 2; }; + + # 16. Create a layered image with more packages than max layers. + # coreutils and hello are part of the same layer + bulk-layer = pkgs.dockerTools.buildLayeredImage { + name = "bulk-layer"; + tag = "latest"; + contents = with pkgs; [ + coreutils hello + ]; + maxLayers = 2; + }; + } diff --git a/pkgs/build-support/docker/store-path-to-layer.sh b/pkgs/build-support/docker/store-path-to-layer.sh index c808abab7a8..7e8efeea1c1 100755 --- a/pkgs/build-support/docker/store-path-to-layer.sh +++ b/pkgs/build-support/docker/store-path-to-layer.sh @@ -5,11 +5,8 @@ set -eu layerNumber=$1 shift -storePath="$1" -shift - layerPath="./layers/$layerNumber" -echo "Creating layer #$layerNumber for $storePath" +echo "Creating layer #$layerNumber for $@" mkdir -p "$layerPath" @@ -35,13 +32,15 @@ tar -cf "$layerPath/layer.tar" \ # 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 \ - --transform="s,$n,/nix/store/$n," \ - $n +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) |