Right, I fixed it. I popped on some Greek funk on the headphones, poured myself a loose-leaf lemon and ginger tea, and got tapping away
. I had not tried sprites before, so it was a fun exercise.
I got the same error, by following Jacob’s notes to the letter, but without the Local stack stuff. sudo is in fact required. My first idea, that the Docker service needs starting, turned out to be incorrect:
sprite@poking-around:~$ docker ps
failed to connect to the docker API at unix:///var/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /var/run/docker.sock: connect: no such file or directory
sprite@poking-around:~$ sudo systemctl start docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to system scope bus via local transport: Host is down
sprite@poking-around:~$ sudo systemctl enable docker
Synchronizing state of docker.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable docker
sprite@poking-around:~$ sudo systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to system scope bus via local transport: Host is down
sprite@poking-around:~$ docker ps
failed to connect to the docker API at unix:///var/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /var/run/docker.sock: connect: no such file or directory
I then surmised that the issue was that I need to be a member of the docker group:
sprite@poking-around:~$ groups
sprite
sprite@poking-around:~$ sudo usermod -aG docker $USER
Usage: usermod [options] LOGIN
Options:
-a, --append append the user to the supplemental GROUPS
mentioned by the -G option without removing
the user from other groups
-b, --badname allow bad names
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-g, --gid GROUP force use GROUP as new primary group
-G, --groups GROUPS new list of supplementary GROUPS
-h, --help display this help message and exit
-l, --login NEW_LOGIN new value of the login name
-L, --lock lock the user account
-m, --move-home move contents of the home directory to the
new location (use only with -d)
-o, --non-unique allow using duplicate (non-unique) UID
-p, --password PASSWORD use encrypted password for the new password
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
-r, --remove remove the user from only the supplemental GROUPS
mentioned by the -G option without removing
the user from other groups
-R, --root CHROOT_DIR directory to chroot into
-s, --shell SHELL new login shell for the user account
-u, --uid UID new UID for the user account
-U, --unlock unlock the user account
-v, --add-subuids FIRST-LAST add range of subordinate uids
-V, --del-subuids FIRST-LAST remove range of subordinate uids
-w, --add-subgids FIRST-LAST add range of subordinate gids
-W, --del-subgids FIRST-LAST remove range of subordinate gids
-Z, --selinux-user SEUSER new SELinux user mapping for the user account
--selinux-range SERANGE new SELinux MLS range for the user account
sprite@poking-around:~$ echo $USER
sprite@poking-around:~$ whoami
sprite
sprite@poking-around:~$ sudo usermod -aG docker sprite
sprite@poking-around:~$ newgrp docker
sprite@poking-around:~$ groups
docker
sprite@poking-around:~$ docker ps
failed to connect to the docker API at unix:///var/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /var/run/docker.sock: connect: no such file or directory
That was also a false lead, and moreover I discover that $USER is not set!
Finally, Jacob was quite right about dockerd having not started up; one just needs to start it manually:
sprite@poking-around:~$ sudo dockerd &
[1] 1848
sprite@poking-around:~$ INFO[2026-02-23T19:28:31.149036664Z] Starting up
INFO[2026-02-23T19:28:31.150927667Z] containerd not running, starting managed containerd
INFO[2026-02-23T19:28:31.152239599Z] started new containerd process address=/var/run/docker/containerd/containerd.sock module=libcontainerd pid=1863
INFO[2026-02-23T19:28:31.176932588Z] starting containerd revision=dea7da592f5d1d2b7755e3a161be07f43fad8f75 version=v2.2.1
WARN[2026-02-23T19:28:31.188177166Z] Configuration migrated from version 2, use `containerd config migrate` to avoid migration t="5.861µs"
INFO[2026-02-23T19:28:31.188503856Z] loading plugin id=io.containerd.content.v1.content type=io.containerd.content.v1
INFO[2026-02-23T19:28:31.188610376Z] loading plugin id=io.containerd.image-verifier.v1.bindir type=io.containerd.image-verifier.v1
INFO[2026-02-23T19:28:31.188636156Z] loading plugin id=io.containerd.internal.v1.opt type=io.containerd.internal.v1
INFO[2026-02-23T19:28:31.192979303Z] loading plugin id=io.containerd.warning.v1.deprecations type=io.containerd.warning.v1
INFO[2026-02-23T19:28:31.193044783Z] loading plugin id=io.containerd.mount-handler.v1.erofs type=io.containerd.mount-handler.v1
INFO[2026-02-23T19:28:31.193072043Z] loading plugin id=io.containerd.snapshotter.v1.blockfile type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193205713Z] skip loading plugin error="no scratch file generator: skip plugin" id=io.containerd.snapshotter.v1.blockfile type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193227124Z] loading plugin id=io.containerd.snapshotter.v1.btrfs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193611744Z] skip loading plugin error="path /var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.btrfs (ext4) must be a btrfs filesystem to be used with the btrfs snapshotter: skip plugin" id=io.containerd.snapshotter.v1.btrfs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193642624Z] loading plugin id=io.containerd.snapshotter.v1.devmapper type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193671374Z] skip loading plugin error="devmapper not configured: skip plugin" id=io.containerd.snapshotter.v1.devmapper type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193688774Z] loading plugin id=io.containerd.snapshotter.v1.erofs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193956085Z] skip loading plugin error="EROFS unsupported, please `modprobe erofs`: skip plugin" id=io.containerd.snapshotter.v1.erofs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.193980285Z] loading plugin id=io.containerd.snapshotter.v1.native type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.194179615Z] loading plugin id=io.containerd.snapshotter.v1.overlayfs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.194613306Z] loading plugin id=io.containerd.snapshotter.v1.zfs type=io.containerd.snapshotter.v1
INFO[2026-02-23T19:28:31.194681736Z] 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
INFO[2026-02-23T19:28:31.194774486Z] loading plugin id=io.containerd.event.v1.exchange type=io.containerd.event.v1
INFO[2026-02-23T19:28:31.194850226Z] loading plugin id=io.containerd.monitor.task.v1.cgroups type=io.containerd.monitor.task.v1
INFO[2026-02-23T19:28:31.195387277Z] loading plugin id=io.containerd.metadata.v1.bolt type=io.containerd.metadata.v1
INFO[2026-02-23T19:28:31.195585187Z] metadata content store policy set policy=shared
INFO[2026-02-23T19:28:31.197455780Z] loading plugin id=io.containerd.gc.v1.scheduler type=io.containerd.gc.v1
INFO[2026-02-23T19:28:31.197519410Z] loading plugin id=io.containerd.nri.v1.nri type=io.containerd.nri.v1
INFO[2026-02-23T19:28:31.197575610Z] built-in NRI default validator is disabled
INFO[2026-02-23T19:28:31.197596100Z] runtime interface created
INFO[2026-02-23T19:28:31.197607380Z] created NRI interface
INFO[2026-02-23T19:28:31.197634780Z] loading plugin id=io.containerd.differ.v1.erofs type=io.containerd.differ.v1
INFO[2026-02-23T19:28:31.197829451Z] 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
INFO[2026-02-23T19:28:31.197858681Z] loading plugin id=io.containerd.differ.v1.walking type=io.containerd.differ.v1
INFO[2026-02-23T19:28:31.197877781Z] loading plugin id=io.containerd.lease.v1.manager type=io.containerd.lease.v1
INFO[2026-02-23T19:28:31.197892191Z] loading plugin id=io.containerd.mount-manager.v1.bolt type=io.containerd.mount-manager.v1
INFO[2026-02-23T19:28:31.198175331Z] loading plugin id=io.containerd.service.v1.containers-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198203041Z] loading plugin id=io.containerd.service.v1.content-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198217541Z] loading plugin id=io.containerd.service.v1.diff-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198231741Z] loading plugin id=io.containerd.service.v1.images-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198250521Z] loading plugin id=io.containerd.service.v1.introspection-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198275901Z] loading plugin id=io.containerd.service.v1.namespaces-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198294702Z] loading plugin id=io.containerd.service.v1.snapshots-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198306732Z] loading plugin id=io.containerd.shim.v1.manager type=io.containerd.shim.v1
INFO[2026-02-23T19:28:31.198321802Z] loading plugin id=io.containerd.runtime.v2.task type=io.containerd.runtime.v2
INFO[2026-02-23T19:28:31.198481392Z] loading plugin id=io.containerd.service.v1.tasks-service type=io.containerd.service.v1
INFO[2026-02-23T19:28:31.198513302Z] loading plugin id=io.containerd.grpc.v1.containers type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198531872Z] loading plugin id=io.containerd.grpc.v1.content type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198548402Z] loading plugin id=io.containerd.grpc.v1.diff type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198567372Z] loading plugin id=io.containerd.grpc.v1.events type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198581062Z] loading plugin id=io.containerd.grpc.v1.images type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198595052Z] loading plugin id=io.containerd.grpc.v1.introspection type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198605152Z] loading plugin id=io.containerd.grpc.v1.leases type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198618842Z] loading plugin id=io.containerd.grpc.v1.mounts type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198632632Z] loading plugin id=io.containerd.grpc.v1.namespaces type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.198648312Z] loading plugin id=io.containerd.sandbox.store.v1.local type=io.containerd.sandbox.store.v1
INFO[2026-02-23T19:28:31.198664532Z] loading plugin id=io.containerd.transfer.v1.local type=io.containerd.transfer.v1
INFO[2026-02-23T19:28:31.198781542Z] loading plugin id=io.containerd.cri.v1.images type=io.containerd.cri.v1
INFO[2026-02-23T19:28:31.198849732Z] Get image filesystem path "/var/lib/docker/containerd/daemon/io.containerd.snapshotter.v1.overlayfs" for snapshotter "overlayfs"
INFO[2026-02-23T19:28:31.198870782Z] Start snapshots syncer
INFO[2026-02-23T19:28:31.198915172Z] loading plugin id=io.containerd.cri.v1.runtime type=io.containerd.cri.v1
INFO[2026-02-23T19:28:31.199213853Z] 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\"}"
INFO[2026-02-23T19:28:31.199289293Z] loading plugin id=io.containerd.podsandbox.controller.v1.podsandbox type=io.containerd.podsandbox.controller.v1
INFO[2026-02-23T19:28:31.199345623Z] loading plugin id=io.containerd.sandbox.controller.v1.shim type=io.containerd.sandbox.controller.v1
INFO[2026-02-23T19:28:31.199499903Z] loading plugin id=io.containerd.grpc.v1.sandbox-controllers type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199524403Z] loading plugin id=io.containerd.grpc.v1.sandboxes type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199537893Z] loading plugin id=io.containerd.grpc.v1.snapshots type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199551233Z] loading plugin id=io.containerd.streaming.v1.manager type=io.containerd.streaming.v1
INFO[2026-02-23T19:28:31.199565754Z] loading plugin id=io.containerd.grpc.v1.streaming type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199592784Z] loading plugin id=io.containerd.grpc.v1.tasks type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199611754Z] loading plugin id=io.containerd.grpc.v1.transfer type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199630774Z] loading plugin id=io.containerd.grpc.v1.version type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.199645954Z] loading plugin id=io.containerd.monitor.container.v1.restart type=io.containerd.monitor.container.v1
INFO[2026-02-23T19:28:31.199680964Z] loading plugin id=io.containerd.tracing.processor.v1.otlp type=io.containerd.tracing.processor.v1
INFO[2026-02-23T19:28:31.199699934Z] skip loading plugin error="skip plugin: tracing endpoint not configured" id=io.containerd.tracing.processor.v1.otlp type=io.containerd.tracing.processor.v1
INFO[2026-02-23T19:28:31.199711624Z] loading plugin id=io.containerd.internal.v1.tracing type=io.containerd.internal.v1
INFO[2026-02-23T19:28:31.199723594Z] skip loading plugin error="skip plugin: tracing endpoint not configured" id=io.containerd.internal.v1.tracing type=io.containerd.internal.v1
INFO[2026-02-23T19:28:31.199732754Z] loading plugin id=io.containerd.ttrpc.v1.otelttrpc type=io.containerd.ttrpc.v1
INFO[2026-02-23T19:28:31.199742824Z] loading plugin id=io.containerd.grpc.v1.healthcheck type=io.containerd.grpc.v1
INFO[2026-02-23T19:28:31.200066074Z] serving... address=/var/run/docker/containerd/containerd-debug.sock
INFO[2026-02-23T19:28:31.200158834Z] serving... address=/var/run/docker/containerd/containerd.sock.ttrpc
INFO[2026-02-23T19:28:31.200226855Z] serving... address=/var/run/docker/containerd/containerd.sock
INFO[2026-02-23T19:28:31.200254365Z] containerd successfully booted in 0.024543s
INFO[2026-02-23T19:28:31.207104235Z] OTEL tracing is not configured, using no-op tracer provider
INFO[2026-02-23T19:28:31.207267956Z] CDI directory does not exist, skipping: failed to monitor for changes: no such file or directory dir=/etc/cdi
INFO[2026-02-23T19:28:31.207292026Z] CDI directory does not exist, skipping: failed to monitor for changes: no such file or directory dir=/var/run/cdi
INFO[2026-02-23T19:28:31.223494391Z] Creating a containerd client address=/var/run/docker/containerd/containerd.sock timeout=1m0s
INFO[2026-02-23T19:28:31.228380279Z] Loading containers: start.
INFO[2026-02-23T19:28:31.228441189Z] NRI is disabled
INFO[2026-02-23T19:28:31.228453469Z] Starting daemon with containerd snapshotter integration enabled
INFO[2026-02-23T19:28:31.231096563Z] Restoring containers: start.
INFO[2026-02-23T19:28:31.266538789Z] Deleting nftables IPv4 rules error="exit status 1"
INFO[2026-02-23T19:28:31.306574803Z] Deleting nftables IPv6 rules error="exit status 1"
INFO[2026-02-23T19:28:31.600315025Z] Loading containers: done.
INFO[2026-02-23T19:28:31.609782100Z] Docker daemon commit=6bc6209 containerd-snapshotter=true storage-driver=overlayfs version=29.2.1
INFO[2026-02-23T19:28:31.609982871Z] Initializing buildkit
INFO[2026-02-23T19:28:31.646252358Z] Completed buildkit initialization
INFO[2026-02-23T19:28:31.652395338Z] Daemon has completed initialization
INFO[2026-02-23T19:28:31.652470278Z] API listen on /var/run/docker.sock
sprite@poking-around:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Bingo!
Give that a try.