Merge pull request #104271 from adisbladis/dockertools-cross
dockerTools.buildLayeredImage: Fix cross compilation
This commit is contained in:
commit
c68e739300
@ -234,5 +234,17 @@ import ./make-test-python.nix ({ pkgs, ... }: {
|
|||||||
"docker run --rm file-in-store nix-store --verify --check-contents",
|
"docker run --rm file-in-store nix-store --verify --check-contents",
|
||||||
"docker run --rm file-in-store |& grep 'some data'",
|
"docker run --rm file-in-store |& grep 'some data'",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
with subtest("Ensure cross compiled image can be loaded and has correct arch."):
|
||||||
|
docker.succeed(
|
||||||
|
"docker load --input='${pkgs.dockerTools.examples.cross-aarch64}'",
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
docker.succeed(
|
||||||
|
"docker inspect ${pkgs.dockerTools.examples.cross-aarch64.imageName} "
|
||||||
|
+ "| ${pkgs.jq}/bin/jq -r .[].Architecture"
|
||||||
|
).strip()
|
||||||
|
== "arm64v8"
|
||||||
|
)
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
writeScript,
|
writeScript,
|
||||||
writeText,
|
writeText,
|
||||||
writePython3,
|
writePython3,
|
||||||
|
system, # Note: This is the cross system we're compiling for
|
||||||
}:
|
}:
|
||||||
|
|
||||||
# WARNING: this API is unstable and may be subject to backwards-incompatible changes in the future.
|
# WARNING: this API is unstable and may be subject to backwards-incompatible changes in the future.
|
||||||
@ -48,7 +49,7 @@ let
|
|||||||
# A user is required by nix
|
# A user is required by nix
|
||||||
# https://github.com/NixOS/nix/blob/9348f9291e5d9e4ba3c4347ea1b235640f54fd79/src/libutil/util.cc#L478
|
# https://github.com/NixOS/nix/blob/9348f9291e5d9e4ba3c4347ea1b235640f54fd79/src/libutil/util.cc#L478
|
||||||
export USER=nobody
|
export USER=nobody
|
||||||
${nix}/bin/nix-store --load-db < ${closureInfo {rootPaths = contentsList;}}/registration
|
${buildPackages.nix}/bin/nix-store --load-db < ${closureInfo {rootPaths = contentsList;}}/registration
|
||||||
|
|
||||||
mkdir -p nix/var/nix/gcroots/docker/
|
mkdir -p nix/var/nix/gcroots/docker/
|
||||||
for i in ${lib.concatStringsSep " " contentsList}; do
|
for i in ${lib.concatStringsSep " " contentsList}; do
|
||||||
@ -56,6 +57,16 @@ let
|
|||||||
done;
|
done;
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# Map nixpkgs architecture to Docker notation
|
||||||
|
# Reference: https://github.com/docker-library/official-images#architectures-other-than-amd64
|
||||||
|
getArch = nixSystem: {
|
||||||
|
aarch64-linux = "arm64v8";
|
||||||
|
armv7l-linux = "arm32v7";
|
||||||
|
x86_64-linux = "amd64";
|
||||||
|
powerpc64le-linux = "ppc64le";
|
||||||
|
i686-linux = "i386";
|
||||||
|
}.${nixSystem} or "Can't map Nix system ${nixSystem} to Docker architecture notation. Please check that your input and your requested build are correct or update the mapping in Nixpkgs.";
|
||||||
|
|
||||||
in
|
in
|
||||||
rec {
|
rec {
|
||||||
|
|
||||||
@ -72,7 +83,7 @@ rec {
|
|||||||
, imageDigest
|
, imageDigest
|
||||||
, sha256
|
, sha256
|
||||||
, os ? "linux"
|
, os ? "linux"
|
||||||
, arch ? buildPackages.go.GOARCH
|
, arch ? getArch system
|
||||||
|
|
||||||
# This is used to set name to the pulled image
|
# This is used to set name to the pulled image
|
||||||
, finalImageName ? imageName
|
, finalImageName ? imageName
|
||||||
@ -443,7 +454,7 @@ rec {
|
|||||||
runCommand "${name}.tar.gz" {
|
runCommand "${name}.tar.gz" {
|
||||||
inherit (stream) imageName;
|
inherit (stream) imageName;
|
||||||
passthru = { inherit (stream) imageTag; };
|
passthru = { inherit (stream) imageTag; };
|
||||||
buildInputs = [ pigz ];
|
nativeBuildInputs = [ pigz ];
|
||||||
} "${stream} | pigz -nT > $out";
|
} "${stream} | pigz -nT > $out";
|
||||||
|
|
||||||
# 1. extract the base image
|
# 1. extract the base image
|
||||||
@ -488,7 +499,7 @@ rec {
|
|||||||
baseJson = let
|
baseJson = let
|
||||||
pure = writeText "${baseName}-config.json" (builtins.toJSON {
|
pure = writeText "${baseName}-config.json" (builtins.toJSON {
|
||||||
inherit created config;
|
inherit created config;
|
||||||
architecture = buildPackages.go.GOARCH;
|
architecture = getArch system;
|
||||||
os = "linux";
|
os = "linux";
|
||||||
});
|
});
|
||||||
impure = runCommand "${baseName}-config.json"
|
impure = runCommand "${baseName}-config.json"
|
||||||
@ -715,7 +726,7 @@ rec {
|
|||||||
streamScript = writePython3 "stream" {} ./stream_layered_image.py;
|
streamScript = writePython3 "stream" {} ./stream_layered_image.py;
|
||||||
baseJson = writeText "${name}-base.json" (builtins.toJSON {
|
baseJson = writeText "${name}-base.json" (builtins.toJSON {
|
||||||
inherit config;
|
inherit config;
|
||||||
architecture = buildPackages.go.GOARCH;
|
architecture = getArch system;
|
||||||
os = "linux";
|
os = "linux";
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -762,7 +773,7 @@ rec {
|
|||||||
else
|
else
|
||||||
lib.head (lib.strings.splitString "-" (baseNameOf conf.outPath));
|
lib.head (lib.strings.splitString "-" (baseNameOf conf.outPath));
|
||||||
paths = referencesByPopularity overallClosure;
|
paths = referencesByPopularity overallClosure;
|
||||||
buildInputs = [ jq ];
|
nativeBuildInputs = [ jq ];
|
||||||
} ''
|
} ''
|
||||||
${if (tag == null) then ''
|
${if (tag == null) then ''
|
||||||
outName="$(basename "$out")"
|
outName="$(basename "$out")"
|
||||||
@ -826,7 +837,7 @@ rec {
|
|||||||
# take images can know in advance how the image is supposed to be used.
|
# take images can know in advance how the image is supposed to be used.
|
||||||
isExe = true;
|
isExe = true;
|
||||||
};
|
};
|
||||||
buildInputs = [ makeWrapper ];
|
nativeBuildInputs = [ makeWrapper ];
|
||||||
} ''
|
} ''
|
||||||
makeWrapper ${streamScript} $out --add-flags ${conf}
|
makeWrapper ${streamScript} $out --add-flags ${conf}
|
||||||
'';
|
'';
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
# $ nix-build '<nixpkgs>' -A dockerTools.examples.redis
|
# $ nix-build '<nixpkgs>' -A dockerTools.examples.redis
|
||||||
# $ docker load < result
|
# $ docker load < result
|
||||||
|
|
||||||
{ pkgs, buildImage, pullImage, shadowSetup, buildImageWithNixDb }:
|
{ pkgs, buildImage, pullImage, shadowSetup, buildImageWithNixDb, pkgsCross }:
|
||||||
|
|
||||||
rec {
|
rec {
|
||||||
# 1. basic example
|
# 1. basic example
|
||||||
@ -407,4 +407,11 @@ rec {
|
|||||||
contents = [ pkgs.bash pkgs.coreutils ] ++ nonRootShadowSetup { uid = 999; user = "somebody"; };
|
contents = [ pkgs.bash pkgs.coreutils ] ++ nonRootShadowSetup { uid = 999; user = "somebody"; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# basic example, with cross compilation
|
||||||
|
cross-aarch64 = pkgsCross.aarch64-multiplatform.dockerTools.buildImage {
|
||||||
|
name = "hello-cross";
|
||||||
|
tag = "latest";
|
||||||
|
contents = pkgsCross.aarch64-multiplatform.hello;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ in
|
|||||||
grsync = callPackage ../applications/misc/grsync { };
|
grsync = callPackage ../applications/misc/grsync { };
|
||||||
|
|
||||||
dockerTools = callPackage ../build-support/docker {
|
dockerTools = callPackage ../build-support/docker {
|
||||||
writePython3 = writers.writePython3;
|
writePython3 = buildPackages.writers.writePython3;
|
||||||
};
|
};
|
||||||
|
|
||||||
snapTools = callPackage ../build-support/snap { };
|
snapTools = callPackage ../build-support/snap { };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user