summary refs log tree commit diff
diff options
context:
space:
mode:
authorlewo <lewo@abesis.fr>2020-01-30 21:10:52 +0100
committerGitHub <noreply@github.com>2020-01-30 21:10:52 +0100
commit86f8732194f20c7073ee05a980abf87376071a83 (patch)
treeff5789ac33fa8c26b941cf90183a3a3619ddba17
parent40be1827ee6fa0fbd1c73e9e97f6b338ca4df421 (diff)
parent01a68479cc08d4f937a93c27f8f36e701e4bd435 (diff)
downloadnixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar.gz
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar.bz2
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar.lz
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar.xz
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.tar.zst
nixpkgs-86f8732194f20c7073ee05a980abf87376071a83.zip
Merge pull request #78834 from nlewo/fix-two-layers-image
Fix dockerTools.buildLayerImage with 2 layers
-rw-r--r--nixos/tests/docker-tools.nix3
-rw-r--r--pkgs/build-support/docker/default.nix8
-rw-r--r--pkgs/build-support/docker/examples.nix8
3 files changed, 17 insertions, 2 deletions
diff --git a/nixos/tests/docker-tools.nix b/nixos/tests/docker-tools.nix
index 9ab1a71f331..07fac533680 100644
--- a/nixos/tests/docker-tools.nix
+++ b/nixos/tests/docker-tools.nix
@@ -80,5 +80,8 @@ import ./make-test.nix ({ pkgs, ... }: {
       # This is to be sure the order of layers of the parent image is preserved
       $docker->succeed("docker run --rm  ${pkgs.dockerTools.examples.layersOrder.imageName} cat /tmp/layer2 | grep -q layer2");
       $docker->succeed("docker run --rm  ${pkgs.dockerTools.examples.layersOrder.imageName} cat /tmp/layer3 | grep -q layer3");
+
+      # Ensure image with only 2 layers can be loaded
+      $docker->succeed("docker load --input='${pkgs.dockerTools.examples.two-layered-image}'");
     '';
 })
diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix
index 3fcae13e20d..509b7e2a7e1 100644
--- a/pkgs/build-support/docker/default.nix
+++ b/pkgs/build-support/docker/default.nix
@@ -315,7 +315,7 @@ rec {
     runCommand "${name}-granular-docker-layers" {
       inherit maxLayers;
       paths = referencesByPopularity overallClosure;
-      nativeBuildInputs = [ jshon rsync tarsum ];
+      nativeBuildInputs = [ jshon rsync tarsum moreutils ];
       enableParallelBuilding = true;
     }
     ''
@@ -335,7 +335,8 @@ rec {
         cat $paths ${lib.concatMapStringsSep " " (path: "| grep -v ${path}") (closures ++ [ overallClosure ])}
       }
 
-      paths | head -n $((maxLayers - 1)) | cat -n | xargs -P$NIX_BUILD_CORES -n2 ${storePathToLayer}
+      # We need to sponge to avoid grep broken pipe error when maxLayers == 1
+      paths | sponge | head -n $((maxLayers - 1)) | cat -n | xargs -r -P$NIX_BUILD_CORES -n2 ${storePathToLayer}
       if [ $(paths | wc -l) -ge $maxLayers ]; then
         paths | tail -n+$maxLayers | xargs ${storePathToLayer} $maxLayers
       fi
@@ -544,6 +545,9 @@ rec {
     # believe the actual maximum is 128.
     maxLayers ? 100
   }:
+    assert
+      (lib.assertMsg (maxLayers > 1)
+      "the maxLayers argument of dockerTools.buildLayeredImage function must be greather than 1 (current value: ${toString maxLayers})");
     let
       baseName = baseNameOf name;
       contentsEnv = symlinkJoin {
diff --git a/pkgs/build-support/docker/examples.nix b/pkgs/build-support/docker/examples.nix
index d7d1a693310..a1f71d35793 100644
--- a/pkgs/build-support/docker/examples.nix
+++ b/pkgs/build-support/docker/examples.nix
@@ -238,4 +238,12 @@ rec {
     config.Cmd = [ "${pkgs.hello}/bin/hello" ];
   };
 
+  # 15. Create a layered image with only 2 layers
+  two-layered-image = pkgs.dockerTools.buildLayeredImage {
+    name = "two-layered-image";
+    tag = "latest";
+    config.Cmd = [ "${pkgs.hello}/bin/hello" ];
+    contents = [ pkgs.bash pkgs.hello ];
+    maxLayers = 2;
+  };
 }