Merge pull request #61089 from nlewo/pr-fix-layer-order
dockerTools: Fix Docker layers order
This commit is contained in:
commit
42ee7cdf9d
@ -67,5 +67,12 @@ import ./make-test.nix ({ pkgs, ... }: {
|
|||||||
# Ensure building an image on top of a layered Docker images work
|
# 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 load --input='${pkgs.dockerTools.examples.layered-on-top}'");
|
||||||
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layered-on-top.imageName}");
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layered-on-top.imageName}");
|
||||||
|
|
||||||
|
# Ensure order of layers is correct
|
||||||
|
$docker->succeed("docker load --input='${pkgs.dockerTools.examples.layersOrder}'");
|
||||||
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layersOrder.imageName} cat /tmp/layer1 | grep -q layer1");
|
||||||
|
# This is to be sure the order of layers of the parent image is preserved
|
||||||
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layersOrder.imageName} cat /tmp/layer2 | grep -q layer2");
|
||||||
|
$docker->succeed("docker run --rm ${pkgs.dockerTools.examples.layersOrder.imageName} cat /tmp/layer3 | grep -q layer3");
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -216,7 +216,7 @@ rec {
|
|||||||
find image/$extractionID/layer -name ".wh.*" -exec bash -c 'name="$(basename {}|sed "s/^.wh.//")"; mknod "$(dirname {})/$name" c 0 0; rm {}' \;
|
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/$extractionID/layer
|
lowerdir=image/$extractionID/layer''${lowerdir:+:}$lowerdir
|
||||||
done
|
done
|
||||||
|
|
||||||
mkdir work
|
mkdir work
|
||||||
@ -585,9 +585,9 @@ rec {
|
|||||||
layerID=$(sha256sum "$layer/json" | cut -d ' ' -f 1)
|
layerID=$(sha256sum "$layer/json" | cut -d ' ' -f 1)
|
||||||
ln -s "$layer" "./image/$layerID"
|
ln -s "$layer" "./image/$layerID"
|
||||||
|
|
||||||
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$layerID/layer.tar\"] + .")
|
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= . + [\"$layerID/layer.tar\"]")
|
||||||
imageJson=$(echo "$imageJson" | jq ".history |= [{\"created\": \"$(jq -r .created ${configJson})\"}] + .")
|
imageJson=$(echo "$imageJson" | jq ".history |= . + [{\"created\": \"$(jq -r .created ${configJson})\"}]")
|
||||||
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= [\"sha256:$layerChecksum\"] + .")
|
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= . + [\"sha256:$layerChecksum\"]")
|
||||||
done
|
done
|
||||||
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
||||||
echo "$imageJson" > "image/$imageJsonChecksum.json"
|
echo "$imageJson" > "image/$imageJsonChecksum.json"
|
||||||
@ -779,23 +779,24 @@ 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
|
# Add the new layer ID to the end of the layer list
|
||||||
(
|
(
|
||||||
|
cat layer-list
|
||||||
# originally this used `sed -i "1i$layerID" layer-list`, but
|
# originally this used `sed -i "1i$layerID" layer-list`, but
|
||||||
# would fail if layer-list was completely empty.
|
# would fail if layer-list was completely empty.
|
||||||
echo "$layerID/layer.tar"
|
echo "$layerID/layer.tar"
|
||||||
cat layer-list
|
|
||||||
) | ${pkgs.moreutils}/bin/sponge 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\"]}]")
|
||||||
|
|
||||||
for layerTar in $(tac ./layer-list); do
|
for layerTar in $(cat ./layer-list); do
|
||||||
layerChecksum=$(sha256sum image/$layerTar | 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\"] + .")
|
# diff_ids order is from the bottom-most to top-most layer
|
||||||
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= [\"$layerTar\"] + .")
|
imageJson=$(echo "$imageJson" | jq ".rootfs.diff_ids |= . + [\"sha256:$layerChecksum\"]")
|
||||||
|
manifestJson=$(echo "$manifestJson" | jq ".[0].Layers |= . + [\"$layerTar\"]")
|
||||||
done
|
done
|
||||||
|
|
||||||
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
imageJsonChecksum=$(echo "$imageJson" | sha256sum | cut -d ' ' -f1)
|
||||||
|
@ -187,4 +187,43 @@ rec {
|
|||||||
runAsRoot = "touch /example-file";
|
runAsRoot = "touch /example-file";
|
||||||
fromImage = bash;
|
fromImage = bash;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# 13. example of 3 layers images This image is used to verify the
|
||||||
|
# order of layers is correct.
|
||||||
|
# It allows to validate
|
||||||
|
# - the layer of parent are below
|
||||||
|
# - the order of parent layer is preserved at image build time
|
||||||
|
# (this is why there are 3 images)
|
||||||
|
layersOrder = let
|
||||||
|
l1 = pkgs.dockerTools.buildImage {
|
||||||
|
name = "l1";
|
||||||
|
tag = "latest";
|
||||||
|
extraCommands = ''
|
||||||
|
mkdir -p tmp
|
||||||
|
echo layer1 > tmp/layer1
|
||||||
|
echo layer1 > tmp/layer2
|
||||||
|
echo layer1 > tmp/layer3
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
l2 = pkgs.dockerTools.buildImage {
|
||||||
|
name = "l2";
|
||||||
|
fromImage = l1;
|
||||||
|
tag = "latest";
|
||||||
|
extraCommands = ''
|
||||||
|
mkdir -p tmp
|
||||||
|
echo layer2 > tmp/layer2
|
||||||
|
echo layer2 > tmp/layer3
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in pkgs.dockerTools.buildImage {
|
||||||
|
name = "l3";
|
||||||
|
fromImage = l2;
|
||||||
|
tag = "latest";
|
||||||
|
contents = [ pkgs.coreutils ];
|
||||||
|
extraCommands = ''
|
||||||
|
mkdir -p tmp
|
||||||
|
echo layer3 > tmp/layer3
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user