mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-01 02:23:54 +00:00
5b4a8db4d9
Allow customisation of the algorithm used to convert nix references graph (created from docker image contents) to docker layers. A collection of building blocks (python functions) is provided, which use can assembled into a processing pipeline by specifying a list of operations (and their initial arguments) via a nix list. Nix references graph if first converted into a python igraph.Graph object (with each vertex representing a nix path), which is then fed into the user defined pipeline. Each stage in the pipeline represents a function call, with initial arguments specified by the user in nix, and the last argument being the result of the previous stage in the pipeline (or the initial Graph object). Each step of the pipeline is expected to produce a data structure consisting of arbitrarily nested lists/dicts with Graph objects (representing docker layers) at it's leafs. The result of the last stage in the pipeline is recursively flattened (with each dict converted into list of values), until a flat list of Graphs remains. This is then output as a json array of arrays (each Graph converted into an array of paths). This functionality is made available via new `layeringPipeline` argument to the `streamLayeredImage`/`buildLayeredImage` functions. The default value of the argument has been chosen to to preserve current layering behaviour. Co-authored-by: Sandro <sandro.jaeckel@gmail.com>
48 lines
1.3 KiB
Nix
48 lines
1.3 KiB
Nix
{
|
|
coreutils,
|
|
flattenReferencesGraph,
|
|
lib,
|
|
jq,
|
|
stdenvNoCC,
|
|
}:
|
|
{
|
|
closureRoots,
|
|
excludePaths ? [ ],
|
|
# This could be a path to (or a derivation producing a path to)
|
|
# a json file containing the pipeline
|
|
pipeline ? [ ],
|
|
debug ? false,
|
|
}:
|
|
if closureRoots == [ ] then
|
|
builtins.toFile "docker-layers-empty" "[]"
|
|
else
|
|
stdenvNoCC.mkDerivation {
|
|
name = "docker-layers";
|
|
__structuredAttrs = true;
|
|
# graph, exclude_paths and pipeline are expected by the
|
|
# flatten_references_graph executable.
|
|
exportReferencesGraph.graph = closureRoots;
|
|
exclude_paths = excludePaths;
|
|
inherit pipeline;
|
|
# builder cannot refer to derivation outputs
|
|
PATH = "${coreutils}/bin:${flattenReferencesGraph}/bin:${jq}/bin";
|
|
builder = builtins.toFile "docker-make-layers-builder" ''
|
|
. .attrs.sh
|
|
|
|
flatten_references_graph_arg=.attrs.json
|
|
|
|
echo "pipeline: $pipeline"
|
|
|
|
if jq -e '.pipeline | type == "string"' .attrs.json; then
|
|
jq '. + { "pipeline": $pipeline[0] }' \
|
|
--slurpfile pipeline "$pipeline" \
|
|
.attrs.json > flatten_references_graph_arg.json
|
|
|
|
flatten_references_graph_arg=flatten_references_graph_arg.json
|
|
fi
|
|
|
|
${lib.optionalString debug "export DEBUG=True"}
|
|
flatten_references_graph "$flatten_references_graph_arg" > ''${outputs[out]}
|
|
'';
|
|
}
|