Additional options for large graphs
ebekebe opened this issue · 1 comments
This is a follow up of #258.
To have a better benchmark I created a skeleton Dockerfile from our real-world 300 lines Dockerfile:
FROM --platform=linux/amd64 ubuntu:22.04 AS ubuntu_amd64
FROM --platform=linux/arm64 ubuntu:22.04 AS ubuntu_arm64
FROM ubuntu:22.04 AS ubuntu_with_amd64_emulation
COPY --from=ubuntu_amd64 /etc/apt/sources.list /etc/apt/sources.list.amd64
COPY --from=ubuntu_arm64 /etc/apt/sources.list /etc/apt/sources.list.arm64
COPY --from=ubuntu_amd64 /usr/bin/cat ./cat
COPY --from=ubuntu_arm64 /usr/bin/cat ./cat
FROM alpine:3.12.0 AS a_dependency
FROM ubuntu_with_amd64_emulation AS base
COPY --from=a_dependency /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.1 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.2 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.3 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.4 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.5 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.6 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.7 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.14.8 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.1 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.2 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.3 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.4 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.5 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.15.6 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.16.1 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.16.2 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.16.3 /bin/cat /tmp/cat
COPY --from=docker.io/alpine:3.16 /bin/cat /tmp/cat
FROM --platform=$BUILDPLATFORM ubuntu:22.04 AS build_buildplatform
RUN --mount=type=cache,target=/root/.m2/repository echo mvn dependencies ...
RUN --mount=type=cache,target=/root/.m2/repository echo mvn package ...
FROM base as test
COPY --from=build_buildplatform /bin/cat /tmp/cat
COPY --from=build_buildplatform /bin/cat /tmp/cat
COPY --from=build_buildplatform /bin/cat /tmp/cat
RUN --mount=type=cache,target=/root/.m2/repository echo mvn verify ...
FROM base
COPY --from=build_buildplatform /bin/cat /tmp/cat
COPY --from=build_buildplatform /bin/cat /tmp/cat
This file will render the same nodes and edges as the original and it also includes a couple of aspects of the original.
Feel free to include this file as a benchmark in your repo.
The rendering currently looks like this (dockerfilegraph -c
):
(Note that I updated the Dockerfile above with real alpine versions so it would build. The images here are generated with fake tags.)
If I play with the flatten option, it doesn't really get more compact/readble (dockerfilegraph -c -u 4
):
The output I prefer looks like this and it is achieved by setting nodesep=0.25,ranksep=2
in the canon file generated by dockerfilegraph -c -o canon
:
So I would love to see an option to override nodesep
and ranksep
directly from the dockerfilegraph
CLI. Maybe even allow overwriting any graph-wide settings.
Another thing to notice is that the nodes for external images don't grow with the image name, but the image name is elided aggressively, so it is hard (and sometimes impossible) to discern the images. This is a problem in the real-world file as well and there it is even more pronounced, since all images use 8-character git hashes as tags. Here, I would like to see an option to set the maximum text length of a node.
Finally, this Dockerfile uses --platform=...
. Visually indicating that --platform
is used for a node, would help to understand the multi-arch behaviour of this Dockerfile better. I could imagine changing the background color and/or allowing renderings for each target platform individually.
Hey Benjamin, once again thanks for your feedback!
The --nodesep
, --ranksep
and --max-label-length
flags are now available.
Finally, this Dockerfile uses --platform=.... Visually indicating that --platform is used for a node, would help to understand the multi-arch behaviour of this Dockerfile better.
Would it help you if the --platform
value shows up in the node label?
Something like:
╭────────────────────────────╮
│ ubuntu_amd64 [linux/amd64] │
╰────────────────────────────╯
[...] allowing renderings for each target platform individually.
I'm not quite sure what you mean by that, could you please elaborate? Also, please feel free to create a separate issue for the --platform
enhancement, we could then already close this one.