Merge pull request #118018 from considerate/master
dockerTools: Implement merging of image tarballs
This commit is contained in:
@@ -686,6 +686,42 @@ rec {
|
||||
in
|
||||
result;
|
||||
|
||||
# Merge the tarballs of images built with buildImage into a single
|
||||
# tarball that contains all images. Running `docker load` on the resulting
|
||||
# tarball will load the images into the docker daemon.
|
||||
mergeImages = images: runCommand "merge-docker-images"
|
||||
{
|
||||
inherit images;
|
||||
nativeBuildInputs = [ pigz jq ];
|
||||
} ''
|
||||
mkdir image inputs
|
||||
# Extract images
|
||||
repos=()
|
||||
manifests=()
|
||||
for item in $images; do
|
||||
name=$(basename $item)
|
||||
mkdir inputs/$name
|
||||
tar -I pigz -xf $item -C inputs/$name
|
||||
if [ -f inputs/$name/repositories ]; then
|
||||
repos+=(inputs/$name/repositories)
|
||||
fi
|
||||
if [ -f inputs/$name/manifest.json ]; then
|
||||
manifests+=(inputs/$name/manifest.json)
|
||||
fi
|
||||
done
|
||||
# Copy all layers from input images to output image directory
|
||||
cp -R --no-clobber inputs/*/* image/
|
||||
# Merge repositories objects and manifests
|
||||
jq -s add "''${repos[@]}" > repositories
|
||||
jq -s add "''${manifests[@]}" > manifest.json
|
||||
# Replace output image repositories and manifest with merged versions
|
||||
mv repositories image/repositories
|
||||
mv manifest.json image/manifest.json
|
||||
# Create tarball and gzip
|
||||
tar -C image --hard-dereference --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --xform s:'^./':: -c . | pigz -nT > $out
|
||||
'';
|
||||
|
||||
|
||||
# Provide a /etc/passwd and /etc/group that contain root and nobody.
|
||||
# Useful when packaging binaries that insist on using nss to look up
|
||||
# username/groups (like nginx).
|
||||
|
||||
@@ -497,4 +497,23 @@ rec {
|
||||
chown 1000 ./home/jane
|
||||
'';
|
||||
};
|
||||
|
||||
# tarball consisting of both bash and redis images
|
||||
mergedBashAndRedis = pkgs.dockerTools.mergeImages [
|
||||
bash
|
||||
redis
|
||||
];
|
||||
|
||||
# tarball consisting of bash (without tag) and redis images
|
||||
mergedBashNoTagAndRedis = pkgs.dockerTools.mergeImages [
|
||||
bashNoTag
|
||||
redis
|
||||
];
|
||||
|
||||
# tarball consisting of bash and layered image with different owner of the
|
||||
# /home/jane directory
|
||||
mergedBashFakeRoot = pkgs.dockerTools.mergeImages [
|
||||
bash
|
||||
layeredImageWithFakeRootCommands
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user