Merge pull request #108416 from srhb/streamlayeredimage-symlinked-storepaths

dockerTools: Fix streamLayeredImage for symlinks

Changed files
+23 -1
nixos
pkgs
build-support
+7
nixos/tests/docker-tools.nix
···
).strip()
== "${if pkgs.system == "aarch64-linux" then "amd64" else "arm64"}"
)
+
+
with subtest("buildLayeredImage doesn't dereference /nix/store symlink layers"):
+
docker.succeed(
+
"docker load --input='${examples.layeredStoreSymlink}'",
+
"docker run --rm ${examples.layeredStoreSymlink.imageName} bash -c 'test -L ${examples.layeredStoreSymlink.passthru.symlink}'",
+
"docker rmi ${examples.layeredStoreSymlink.imageName}",
+
)
'';
})
+11
pkgs/build-support/docker/examples.nix
···
contents = crossPkgs.hello;
};
+
# layered image where a store path is itself a symlink
+
layeredStoreSymlink =
+
let
+
target = pkgs.writeTextDir "dir/target" "Content doesn't matter.";
+
symlink = pkgs.runCommandNoCC "symlink" {} "ln -s ${target} $out";
+
in
+
pkgs.dockerTools.buildLayeredImage {
+
name = "layeredstoresymlink";
+
tag = "latest";
+
contents = [ pkgs.bash symlink ];
+
} // { passthru = { inherit symlink; }; };
}
+5 -1
pkgs/build-support/docker/stream_layered_image.py
···
for path in paths:
path = pathlib.Path(path)
-
files = itertools.chain([path], path.rglob("*"))
+
if path.is_symlink():
+
files = [path]
+
else:
+
files = itertools.chain([path], path.rglob("*"))
+
for filename in sorted(files):
ti = append_root(tar.gettarinfo(filename))