mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-14 06:00:33 +03:00
Merge pull request #51528 from grahamc/buildImage-on-layered-image
dockertools buildImage: support new-style image specs
This commit is contained in:
commit
f7e67be1dc
3 changed files with 54 additions and 15 deletions
|
@ -62,5 +62,9 @@ import ./make-test.nix ({ pkgs, ... }: {
|
||||||
# Ensure Layered Docker images work
|
# Ensure Layered Docker images work
|
||||||
$docker->succeed("docker load --input='${pkgs.dockerTools.examples.layered-image}'");
|
$docker->succeed("docker load --input='${pkgs.dockerTools.examples.layered-image}'");
|
||||||
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layered-image.imageName}");
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layered-image.imageName}");
|
||||||
|
|
||||||
|
# Ensure building an image on top of a layered Docker images work
|
||||||
|
$docker->succeed("docker load --input='${pkgs.dockerTools.examples.layered-on-top}'");
|
||||||
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layered-on-top.imageName}");
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
|
|
@ -188,22 +188,27 @@ rec {
|
||||||
# Use the name and tag to get the parent ID field.
|
# Use the name and tag to get the parent ID field.
|
||||||
parentID=$(jshon -e $fromImageName -e $fromImageTag -u \
|
parentID=$(jshon -e $fromImageName -e $fromImageTag -u \
|
||||||
< image/repositories)
|
< image/repositories)
|
||||||
|
|
||||||
|
cat ./image/manifest.json | jq -r '.[0].Layers | .[]' > layer-list
|
||||||
|
else
|
||||||
|
touch layer-list
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Unpack all of the parent layers into the image.
|
# Unpack all of the parent layers into the image.
|
||||||
lowerdir=""
|
lowerdir=""
|
||||||
while [[ -n "$parentID" ]]; do
|
extractionID=0
|
||||||
echo "Unpacking layer $parentID"
|
for layerTar in $(cat layer-list); do
|
||||||
mkdir -p image/$parentID/layer
|
echo "Unpacking layer $layerTar"
|
||||||
tar -C image/$parentID/layer -xpf image/$parentID/layer.tar
|
extractionID=$((extractionID + 1))
|
||||||
rm image/$parentID/layer.tar
|
|
||||||
|
|
||||||
find image/$parentID/layer -name ".wh.*" -exec bash -c 'name="$(basename {}|sed "s/^.wh.//")"; mknod "$(dirname {})/$name" c 0 0; rm {}' \;
|
mkdir -p image/$extractionID/layer
|
||||||
|
tar -C image/$extractionID/layer -xpf $layerTar
|
||||||
|
rm $layerTar
|
||||||
|
|
||||||
|
find image/$extractionID/layer -name ".wh.*" -exec bash -c 'name="$(basename {}|sed "s/^.wh.//")"; mknod "$(dirname {})/$name" c 0 0; rm {}' \;
|
||||||
|
|
||||||
# Get the next lower directory and continue the loop.
|
# Get the next lower directory and continue the loop.
|
||||||
lowerdir=$lowerdir''${lowerdir:+:}image/$parentID/layer
|
lowerdir=$lowerdir''${lowerdir:+:}image/$extractionID/layer
|
||||||
parentID=$(cat image/$parentID/json \
|
|
||||||
| (jshon -e parent -u 2>/dev/null || true))
|
|
||||||
done
|
done
|
||||||
|
|
||||||
mkdir work
|
mkdir work
|
||||||
|
@ -673,6 +678,9 @@ rec {
|
||||||
if [[ -n "$fromImage" ]]; then
|
if [[ -n "$fromImage" ]]; then
|
||||||
echo "Unpacking base image..."
|
echo "Unpacking base image..."
|
||||||
tar -C image -xpf "$fromImage"
|
tar -C image -xpf "$fromImage"
|
||||||
|
|
||||||
|
cat ./image/manifest.json | jq -r '.[0].Layers | .[]' > layer-list
|
||||||
|
|
||||||
# Do not import the base image configuration and manifest
|
# Do not import the base image configuration and manifest
|
||||||
chmod a+w image image/*.json
|
chmod a+w image image/*.json
|
||||||
rm -f image/*.json
|
rm -f image/*.json
|
||||||
|
@ -690,6 +698,8 @@ rec {
|
||||||
for l in image/*/layer.tar; do
|
for l in image/*/layer.tar; do
|
||||||
ls_tar $l >> baseFiles
|
ls_tar $l >> baseFiles
|
||||||
done
|
done
|
||||||
|
else
|
||||||
|
touch layer-list
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chmod -R ug+rw image
|
chmod -R ug+rw image
|
||||||
|
@ -742,17 +752,23 @@ rec {
|
||||||
# Use the temp folder we've been working on to create a new image.
|
# Use the temp folder we've been working on to create a new image.
|
||||||
mv temp image/$layerID
|
mv temp image/$layerID
|
||||||
|
|
||||||
|
# Add the new layer ID to the beginning of the layer list
|
||||||
|
(
|
||||||
|
# originally this used `sed -i "1i$layerID" layer-list`, but
|
||||||
|
# would fail if layer-list was completely empty.
|
||||||
|
echo "$layerID/layer.tar"
|
||||||
|
cat layer-list
|
||||||
|
) | ${pkgs.moreutils}/bin/sponge layer-list
|
||||||
|
|
||||||
# Create image json and image manifest
|
# Create image json and image manifest
|
||||||
imageJson=$(cat ${baseJson} | jq ". + {\"rootfs\": {\"diff_ids\": [], \"type\": \"layers\"}}")
|
imageJson=$(cat ${baseJson} | jq ". + {\"rootfs\": {\"diff_ids\": [], \"type\": \"layers\"}}")
|
||||||
manifestJson=$(jq -n "[{\"RepoTags\":[\"$imageName:$imageTag\"]}]")
|
manifestJson=$(jq -n "[{\"RepoTags\":[\"$imageName:$imageTag\"]}]")
|
||||||
currentID=$layerID
|
|
||||||
while [[ -n "$currentID" ]]; do
|
for layerTar in $(cat ./layer-list); do
|
||||||
layerChecksum=$(sha256sum image/$currentID/layer.tar | cut -d ' ' -f1)
|
layerChecksum=$(sha256sum image/$layerTar | cut -d ' ' -f1)
|
||||||
imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"$(jq -r .created ${baseJson})\"}] + .")
|
imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"$(jq -r .created ${baseJson})\"}] + .")
|
||||||
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= [\"sha256:$layerChecksum\"] + .")
|
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= [\"sha256:$layerChecksum\"] + .")
|
||||||
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$currentID/layer.tar\"] + .")
|
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$layerTar\"] + .")
|
||||||
|
|
||||||
currentID=$(cat image/$currentID/json | (jshon -e parent -u 2>/dev/null || true))
|
|
||||||
done
|
done
|
||||||
|
|
||||||
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
||||||
|
|
|
@ -156,5 +156,24 @@ rec {
|
||||||
name = "layered-image";
|
name = "layered-image";
|
||||||
tag = "latest";
|
tag = "latest";
|
||||||
config.Cmd = [ "${pkgs.hello}/bin/hello" ];
|
config.Cmd = [ "${pkgs.hello}/bin/hello" ];
|
||||||
|
contents = [ pkgs.hello pkgs.bash pkgs.coreutils ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# 11. Create an image on top of a layered image
|
||||||
|
layered-on-top = pkgs.dockerTools.buildImage {
|
||||||
|
name = "layered-on-top";
|
||||||
|
tag = "latest";
|
||||||
|
fromImage = layered-image;
|
||||||
|
extraCommands = ''
|
||||||
|
mkdir ./example-output
|
||||||
|
chmod 777 ./example-output
|
||||||
|
'';
|
||||||
|
config = {
|
||||||
|
Env = [ "PATH=${pkgs.coreutils}/bin/" ];
|
||||||
|
WorkingDir = "/example-output";
|
||||||
|
Cmd = [
|
||||||
|
"${pkgs.bash}/bin/bash" "-c" "echo hello > foo; cat foo"
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue