refactor: migrate to src/ package + add DinD-based E2E runner with debug artifacts

- Replace legacy standalone scripts with a proper src-layout Python package
  (baudolo backup/restore/configure entrypoints via pyproject.toml)
- Remove old scripts/files (backup-docker-to-local.py, recover-docker-from-local.sh,
  databases.csv.tpl, Todo.md)
- Add Dockerfile to build the project image for local/E2E usage
- Update Makefile: build image and run E2E via external runner script
- Add scripts/test-e2e.sh:
  - start DinD + dedicated network
  - recreate DinD data volume (and shared /tmp volume)
  - pre-pull helper images (alpine-rsync, alpine)
  - load local baudolo:local image into DinD
  - run unittest E2E suite inside DinD and abort on first failure
  - on failure: dump host+DinD diagnostics and archive shared /tmp into artifacts/
- Add artifacts/ debug outputs produced by failing E2E runs (logs, events, tmp archive)

https://chatgpt.com/share/694ec23f-0794-800f-9a59-8365bc80f435
This commit is contained in:
2025-12-26 18:13:26 +01:00
parent 41910aece2
commit c30b4865d4
55 changed files with 2950 additions and 804 deletions

View File

@@ -0,0 +1,113 @@
cat: can't open '/proc/net/ip6_tables_names': No such file or directory
cat: can't open '/proc/net/arp_tables_names': No such file or directory
iptables v1.8.11 (nf_tables)
time="2025-12-26T17:04:50.613107807Z" level=info msg="Starting up"
time="2025-12-26T17:04:50.613339353Z" level=warning msg="Binding to IP address without --tlsverify is insecure and gives root access on this machine to everyone who has access to your network." host="tcp://0.0.0.0:2375"
time="2025-12-26T17:04:50.613346861Z" level=warning msg="Binding to an IP address, even on localhost, can also give access to scripts run in a browser. Be safe out there!" host="tcp://0.0.0.0:2375"
time="2025-12-26T17:04:50.613349917Z" level=warning msg="[DEPRECATION NOTICE] In future versions this will be a hard failure preventing the daemon from starting! Learn more at: https://docs.docker.com/go/api-security/" host="tcp://0.0.0.0:2375"
time="2025-12-26T17:04:51.613771872Z" level=info msg="containerd not running, starting managed containerd"
time="2025-12-26T17:04:51.614652534Z" level=info msg="started new containerd process" address=/var/run/docker/containerd/containerd.sock module=libcontainerd pid=38
time="2025-12-26T17:04:51.622815401Z" level=info msg="starting containerd" revision=1c4457e00facac03ce1d75f7b6777a7a851e5c41 version=v2.2.0
time="2025-12-26T17:04:51.627029971Z" level=warning msg="Configuration migrated from version 2, use `containerd config migrate` to avoid migration" t="1.695µs"
time="2025-12-26T17:04:51.627048536Z" level=info msg="loading plugin" id=io.containerd.content.v1.content type=io.containerd.content.v1
time="2025-12-26T17:04:51.627067091Z" level=info msg="loading plugin" id=io.containerd.image-verifier.v1.bindir type=io.containerd.image-verifier.v1
time="2025-12-26T17:04:51.627071644Z" level=info msg="loading plugin" id=io.containerd.internal.v1.opt type=io.containerd.internal.v1
time="2025-12-26T17:04:51.627157330Z" level=info msg="loading plugin" id=io.containerd.warning.v1.deprecations type=io.containerd.warning.v1
time="2025-12-26T17:04:51.627162094Z" level=info msg="loading plugin" id=io.containerd.mount-handler.v1.erofs type=io.containerd.mount-handler.v1
time="2025-12-26T17:04:51.627168687Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.blockfile type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627186430Z" level=info msg="skip loading plugin" error="no scratch file generator: skip plugin" id=io.containerd.snapshotter.v1.blockfile type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627190221Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.devmapper type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627194071Z" level=info msg="skip loading plugin" error="devmapper not configured: skip plugin" id=io.containerd.snapshotter.v1.devmapper type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627197321Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.erofs type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627263105Z" level=info msg="skip loading plugin" error="EROFS unsupported, please `modprobe erofs`: skip plugin" id=io.containerd.snapshotter.v1.erofs type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627267252Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.native type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627289297Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.overlayfs type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627351514Z" level=info msg="loading plugin" id=io.containerd.snapshotter.v1.zfs type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627366412Z" level=info msg="skip loading plugin" error="lstat /var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.zfs: no such file or directory: skip plugin" id=io.containerd.snapshotter.v1.zfs type=io.containerd.snapshotter.v1
time="2025-12-26T17:04:51.627370505Z" level=info msg="loading plugin" id=io.containerd.event.v1.exchange type=io.containerd.event.v1
time="2025-12-26T17:04:51.627384024Z" level=info msg="loading plugin" id=io.containerd.monitor.task.v1.cgroups type=io.containerd.monitor.task.v1
time="2025-12-26T17:04:51.627567625Z" level=info msg="loading plugin" id=io.containerd.metadata.v1.bolt type=io.containerd.metadata.v1
time="2025-12-26T17:04:51.627694627Z" level=info msg="metadata content store policy set" policy=shared
time="2025-12-26T17:04:51.671110562Z" level=info msg="loading plugin" id=io.containerd.gc.v1.scheduler type=io.containerd.gc.v1
time="2025-12-26T17:04:51.671180400Z" level=info msg="loading plugin" id=io.containerd.nri.v1.nri type=io.containerd.nri.v1
time="2025-12-26T17:04:51.671214347Z" level=info msg="built-in NRI default validator is disabled"
time="2025-12-26T17:04:51.671233509Z" level=info msg="runtime interface created"
time="2025-12-26T17:04:51.671237604Z" level=info msg="created NRI interface"
time="2025-12-26T17:04:51.671243623Z" level=info msg="loading plugin" id=io.containerd.differ.v1.erofs type=io.containerd.differ.v1
time="2025-12-26T17:04:51.671341286Z" level=info msg="skip loading plugin" error="failed to check mkfs.erofs availability: failed to run mkfs.erofs --help: exec: \"mkfs.erofs\": executable file not found in $PATH: skip plugin" id=io.containerd.differ.v1.erofs type=io.containerd.differ.v1
time="2025-12-26T17:04:51.671353665Z" level=info msg="loading plugin" id=io.containerd.differ.v1.walking type=io.containerd.differ.v1
time="2025-12-26T17:04:51.671363925Z" level=info msg="loading plugin" id=io.containerd.lease.v1.manager type=io.containerd.lease.v1
time="2025-12-26T17:04:51.671371889Z" level=info msg="loading plugin" id=io.containerd.mount-manager.v1.bolt type=io.containerd.mount-manager.v1
time="2025-12-26T17:04:51.682298424Z" level=info msg="loading plugin" id=io.containerd.service.v1.containers-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682322472Z" level=info msg="loading plugin" id=io.containerd.service.v1.content-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682333398Z" level=info msg="loading plugin" id=io.containerd.service.v1.diff-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682341979Z" level=info msg="loading plugin" id=io.containerd.service.v1.images-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682350038Z" level=info msg="loading plugin" id=io.containerd.service.v1.introspection-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682357562Z" level=info msg="loading plugin" id=io.containerd.service.v1.namespaces-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682373750Z" level=info msg="loading plugin" id=io.containerd.service.v1.snapshots-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682381707Z" level=info msg="loading plugin" id=io.containerd.shim.v1.manager type=io.containerd.shim.v1
time="2025-12-26T17:04:51.682391080Z" level=info msg="loading plugin" id=io.containerd.runtime.v2.task type=io.containerd.runtime.v2
time="2025-12-26T17:04:51.682525041Z" level=info msg="loading plugin" id=io.containerd.service.v1.tasks-service type=io.containerd.service.v1
time="2025-12-26T17:04:51.682541064Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.containers type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682550397Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.content type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682557457Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.diff type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682565722Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.events type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682572929Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.images type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682580571Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.introspection type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682587529Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.leases type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682595171Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.mounts type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682601599Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.namespaces type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.682610883Z" level=info msg="loading plugin" id=io.containerd.sandbox.store.v1.local type=io.containerd.sandbox.store.v1
time="2025-12-26T17:04:51.682621078Z" level=info msg="loading plugin" id=io.containerd.transfer.v1.local type=io.containerd.transfer.v1
time="2025-12-26T17:04:51.682644046Z" level=info msg="loading plugin" id=io.containerd.cri.v1.images type=io.containerd.cri.v1
time="2025-12-26T17:04:51.682674205Z" level=info msg="Get image filesystem path \"/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs\" for snapshotter \"overlayfs\""
time="2025-12-26T17:04:51.682683653Z" level=info msg="Start snapshots syncer"
time="2025-12-26T17:04:51.682701064Z" level=info msg="loading plugin" id=io.containerd.cri.v1.runtime type=io.containerd.cri.v1
time="2025-12-26T17:04:51.682882056Z" level=info msg="starting cri plugin" config="{\"containerd\":{\"defaultRuntimeName\":\"runc\",\"runtimes\":{\"runc\":{\"runtimeType\":\"io.containerd.runc.v2\",\"runtimePath\":\"\",\"PodAnnotations\":null,\"ContainerAnnotations\":null,\"options\":{\"BinaryName\":\"\",\"CriuImagePath\":\"\",\"CriuWorkPath\":\"\",\"IoGid\":0,\"IoUid\":0,\"NoNewKeyring\":false,\"Root\":\"\",\"ShimCgroup\":\"\",\"SystemdCgroup\":false},\"privileged_without_host_devices\":false,\"privileged_without_host_devices_all_devices_allowed\":false,\"cgroupWritable\":false,\"baseRuntimeSpec\":\"\",\"cniConfDir\":\"\",\"cniMaxConfNum\":0,\"snapshotter\":\"\",\"sandboxer\":\"podsandbox\",\"io_type\":\"\"}},\"ignoreBlockIONotEnabledErrors\":false,\"ignoreRdtNotEnabledErrors\":false},\"cni\":{\"binDir\":\"\",\"binDirs\":[\"/opt/cni/bin\"],\"confDir\":\"/etc/cni/net.d\",\"maxConfNum\":1,\"setupSerially\":false,\"confTemplate\":\"\",\"ipPref\":\"\",\"useInternalLoopback\":false},\"enableSelinux\":false,\"selinuxCategoryRange\":1024,\"maxContainerLogLineSize\":16384,\"disableApparmor\":false,\"restrictOOMScoreAdj\":false,\"disableProcMount\":false,\"unsetSeccompProfile\":\"\",\"tolerateMissingHugetlbController\":true,\"disableHugetlbController\":true,\"device_ownership_from_security_context\":false,\"ignoreImageDefinedVolumes\":false,\"netnsMountsUnderStateDir\":false,\"enableUnprivilegedPorts\":true,\"enableUnprivilegedICMP\":true,\"enableCDI\":true,\"cdiSpecDirs\":[\"/etc/cdi\",\"/var/run/cdi\"],\"drainExecSyncIOTimeout\":\"0s\",\"ignoreDeprecationWarnings\":null,\"containerdRootDir\":\"/var/lib/docker/containerd/daemon\",\"containerdEndpoint\":\"/var/run/docker/containerd/containerd.sock\",\"rootDir\":\"/var/lib/docker/containerd/daemon/io.containerd.grpc.v1.cri\",\"stateDir\":\"/var/run/docker/containerd/daemon/io.containerd.grpc.v1.cri\"}"
time="2025-12-26T17:04:51.682925497Z" level=info msg="loading plugin" id=io.containerd.podsandbox.controller.v1.podsandbox type=io.containerd.podsandbox.controller.v1
time="2025-12-26T17:04:51.682973419Z" level=info msg="loading plugin" id=io.containerd.sandbox.controller.v1.shim type=io.containerd.sandbox.controller.v1
time="2025-12-26T17:04:51.683071161Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.sandbox-controllers type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683095568Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.sandboxes type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683108804Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.snapshots type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683116807Z" level=info msg="loading plugin" id=io.containerd.streaming.v1.manager type=io.containerd.streaming.v1
time="2025-12-26T17:04:51.683124837Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.streaming type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683134026Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.tasks type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683141550Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.transfer type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683150586Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.version type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683157413Z" level=info msg="loading plugin" id=io.containerd.monitor.container.v1.restart type=io.containerd.monitor.container.v1
time="2025-12-26T17:04:51.683181945Z" level=info msg="loading plugin" id=io.containerd.tracing.processor.v1.otlp type=io.containerd.tracing.processor.v1
time="2025-12-26T17:04:51.683191987Z" level=info msg="skip loading plugin" error="skip plugin: tracing endpoint not configured" id=io.containerd.tracing.processor.v1.otlp type=io.containerd.tracing.processor.v1
time="2025-12-26T17:04:51.683198479Z" level=info msg="loading plugin" id=io.containerd.internal.v1.tracing type=io.containerd.internal.v1
time="2025-12-26T17:04:51.683205005Z" level=info msg="skip loading plugin" error="skip plugin: tracing endpoint not configured" id=io.containerd.internal.v1.tracing type=io.containerd.internal.v1
time="2025-12-26T17:04:51.683210667Z" level=info msg="loading plugin" id=io.containerd.ttrpc.v1.otelttrpc type=io.containerd.ttrpc.v1
time="2025-12-26T17:04:51.683217137Z" level=info msg="loading plugin" id=io.containerd.grpc.v1.healthcheck type=io.containerd.grpc.v1
time="2025-12-26T17:04:51.683382334Z" level=info msg=serving... address=/var/run/docker/containerd/containerd-debug.sock
time="2025-12-26T17:04:51.683440740Z" level=info msg=serving... address=/var/run/docker/containerd/containerd.sock.ttrpc
time="2025-12-26T17:04:51.683482395Z" level=info msg=serving... address=/var/run/docker/containerd/containerd.sock
time="2025-12-26T17:04:51.683496332Z" level=info msg="containerd successfully booted in 0.061180s"
time="2025-12-26T17:04:51.689868310Z" level=info msg="OTEL tracing is not configured, using no-op tracer provider"
time="2025-12-26T17:04:51.689928240Z" level=info msg="CDI directory does not exist, skipping: failed to monitor for changes: no such file or directory" dir=/etc/cdi
time="2025-12-26T17:04:51.689933180Z" level=info msg="CDI directory does not exist, skipping: failed to monitor for changes: no such file or directory" dir=/var/run/cdi
time="2025-12-26T17:04:51.696060714Z" level=info msg="Creating a containerd client" address=/var/run/docker/containerd/containerd.sock timeout=1m0s
time="2025-12-26T17:04:51.748026436Z" level=info msg="Loading containers: start."
time="2025-12-26T17:04:51.748060954Z" level=info msg="Starting daemon with containerd snapshotter integration enabled"
time="2025-12-26T17:04:51.749558601Z" level=info msg="Restoring containers: start."
time="2025-12-26T17:04:51.759819367Z" level=info msg="Deleting nftables IPv4 rules" error="exec: \"nft\": executable file not found in $PATH"
time="2025-12-26T17:04:51.759838278Z" level=info msg="Deleting nftables IPv6 rules" error="exec: \"nft\": executable file not found in $PATH"
time="2025-12-26T17:04:51.947199035Z" level=info msg="Loading containers: done."
time="2025-12-26T17:04:51.952524862Z" level=warning msg="[DEPRECATION NOTICE]: API is accessible on http://0.0.0.0:2375 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: https://docs.docker.com/go/attack-surface/\nIn future versions this will be a hard failure preventing the daemon from starting! Learn more at: https://docs.docker.com/go/api-security/"
time="2025-12-26T17:04:51.952549078Z" level=info msg="Docker daemon" commit=fbf3ed2 containerd-snapshotter=true storage-driver=overlayfs version=29.1.3
time="2025-12-26T17:04:51.952629278Z" level=info msg="Initializing buildkit"
time="2025-12-26T17:04:52.020834951Z" level=info msg="Completed buildkit initialization"
time="2025-12-26T17:04:52.025499900Z" level=info msg="Daemon has completed initialization"
time="2025-12-26T17:04:52.025532980Z" level=info msg="API listen on /var/run/docker.sock"
time="2025-12-26T17:04:52.025551717Z" level=info msg="API listen on [::]:2375"
time="2025-12-26T17:04:57.724576270Z" level=info msg="image pulled" digest="sha256:049c6ec3dad73daa72a97d8031862bb66cd07ae65db661c82b9a739cdc3fc294" remote="ghcr.io/kevinveenbirkenbach/alpine-rsync:latest"
time="2025-12-26T17:05:02.767455556Z" level=info msg="image pulled" digest="sha256:765942a4039992336de8dd5db680586e1a206607dd06170ff0a37267a9e01958" remote="docker.io/library/alpine:3.20"
time="2025-12-26T17:05:07.941089635Z" level=info msg="connecting to shim f606f132edfe329a81b3ec57a35a707f957409c387c10e7b8e78f984cbbef72f" address="unix:///run/containerd/s/d8dd997d64f10682ec22cc749e044ca9c730cb6f71bde41ab934c21fba8c11da" namespace=moby protocol=ttrpc version=3
time="2025-12-26T17:05:08.050665605Z" level=info msg="No non-localhost DNS nameservers are left in resolv.conf. Using default external servers"
time="2025-12-26T17:05:08.067292062Z" level=info msg="sbJoin: gwep4 ''->'ce9a9cdb2d56', gwep6 ''->''" eid=ce9a9cdb2d56 ep=eloquent_solomon net=bridge nid=f9303d265b7c
time="2025-12-26T17:05:08.122943760Z" level=info msg="ignoring event" container=f606f132edfe329a81b3ec57a35a707f957409c387c10e7b8e78f984cbbef72f module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
time="2025-12-26T17:05:08.123007623Z" level=info msg="shim disconnected" id=f606f132edfe329a81b3ec57a35a707f957409c387c10e7b8e78f984cbbef72f namespace=moby
time="2025-12-26T17:05:08.123023007Z" level=info msg="cleaning up after shim disconnected" id=f606f132edfe329a81b3ec57a35a707f957409c387c10e7b8e78f984cbbef72f namespace=moby
time="2025-12-26T17:05:08.123026335Z" level=info msg="cleaning up dead shim" id=f606f132edfe329a81b3ec57a35a707f957409c387c10e7b8e78f984cbbef72f namespace=moby