dockerTools.buildLayeredImage: image names with registry/ prefix

When using `buildLayeredImage`, it is not possible to specify an image
name of the form `<registry>/my/image`, although it is a valid name.

This is due to derivations under `buildLayeredImage` using that image
name as their derivation name, but slashes are not permitted in that
context.

A while ago, #13099 fixed that exact same problem in `buildImage` by
using `baseNameOf name` in derivation names instead of `name`. This
change does the same thing for `buildLayeredImage`.
This commit is contained in:
Louis Blin 2021-03-09 18:32:54 +00:00
parent 0124e874f6
commit 419a4fa596
3 changed files with 37 additions and 5 deletions

View File

@ -254,5 +254,21 @@ import ./make-test-python.nix ({ pkgs, ... }: {
"docker run --rm ${examples.layeredStoreSymlink.imageName} bash -c 'test -L ${examples.layeredStoreSymlink.passthru.symlink}'", "docker run --rm ${examples.layeredStoreSymlink.imageName} bash -c 'test -L ${examples.layeredStoreSymlink.passthru.symlink}'",
"docker rmi ${examples.layeredStoreSymlink.imageName}", "docker rmi ${examples.layeredStoreSymlink.imageName}",
) )
with subtest("buildImage supports registry/ prefix in image name"):
docker.succeed(
"docker load --input='${examples.prefixedImage}'"
)
docker.succeed(
"docker images --format '{{.Repository}}' | grep -F '${examples.prefixedImage.imageName}'"
)
with subtest("buildLayeredImage supports registry/ prefix in image name"):
docker.succeed(
"docker load --input='${examples.prefixedLayeredImage}'"
)
docker.succeed(
"docker images --format '{{.Repository}}' | grep -F '${examples.prefixedLayeredImage.imageName}'"
)
''; '';
}) })

View File

@ -447,7 +447,7 @@ rec {
let let
stream = streamLayeredImage args; stream = streamLayeredImage args;
in in
runCommand "${name}.tar.gz" { runCommand "${baseNameOf name}.tar.gz" {
inherit (stream) imageName; inherit (stream) imageName;
passthru = { inherit (stream) imageTag; }; passthru = { inherit (stream) imageTag; };
nativeBuildInputs = [ pigz ]; nativeBuildInputs = [ pigz ];
@ -746,8 +746,10 @@ rec {
(lib.assertMsg (maxLayers > 1) (lib.assertMsg (maxLayers > 1)
"the maxLayers argument of dockerTools.buildLayeredImage function must be greather than 1 (current value: ${toString maxLayers})"); "the maxLayers argument of dockerTools.buildLayeredImage function must be greather than 1 (current value: ${toString maxLayers})");
let let
baseName = baseNameOf name;
streamScript = writePython3 "stream" {} ./stream_layered_image.py; streamScript = writePython3 "stream" {} ./stream_layered_image.py;
baseJson = writeText "${name}-base.json" (builtins.toJSON { baseJson = writeText "${baseName}-base.json" (builtins.toJSON {
inherit config; inherit config;
architecture = defaultArch; architecture = defaultArch;
os = "linux"; os = "linux";
@ -759,7 +761,7 @@ rec {
# things like permissions set on 'extraCommands' are not overriden # things like permissions set on 'extraCommands' are not overriden
# by Nix. Then we precompute the sha256 for performance. # by Nix. Then we precompute the sha256 for performance.
customisationLayer = symlinkJoin { customisationLayer = symlinkJoin {
name = "${name}-customisation-layer"; name = "${baseName}-customisation-layer";
paths = contentsList; paths = contentsList;
inherit extraCommands; inherit extraCommands;
postBuild = '' postBuild = ''
@ -788,7 +790,7 @@ rec {
# so they'll be excluded from the created images. # so they'll be excluded from the created images.
unnecessaryDrvs = [ baseJson overallClosure ]; unnecessaryDrvs = [ baseJson overallClosure ];
conf = runCommand "${name}-conf.json" { conf = runCommand "${baseName}-conf.json" {
inherit maxLayers created; inherit maxLayers created;
imageName = lib.toLower name; imageName = lib.toLower name;
passthru.imageTag = passthru.imageTag =
@ -852,7 +854,7 @@ rec {
--arg created "$created" | --arg created "$created" |
tee $out tee $out
''; '';
result = runCommand "stream-${name}" { result = runCommand "stream-${baseName}" {
inherit (conf) imageName; inherit (conf) imageName;
passthru = { passthru = {
inherit (conf) imageTag; inherit (conf) imageTag;

View File

@ -427,4 +427,18 @@ rec {
tag = "latest"; tag = "latest";
contents = [ pkgs.bash symlink ]; contents = [ pkgs.bash symlink ];
} // { passthru = { inherit symlink; }; }; } // { passthru = { inherit symlink; }; };
# image with registry/ prefix
prefixedImage = pkgs.dockerTools.buildImage {
name = "registry-1.docker.io/image";
tag = "latest";
config.Cmd = [ "${pkgs.hello}/bin/hello" ];
};
# layered image with registry/ prefix
prefixedLayeredImage = pkgs.dockerTools.buildLayeredImage {
name = "registry-1.docker.io/layered-image";
tag = "latest";
config.Cmd = [ "${pkgs.hello}/bin/hello" ];
};
} }