Releases: getkern/kern
Releases · getkern/kern
Release list
v0.6.21
kern 0.6.21
Compose compatibility, measured against 109 real docker-compose.yml files (all
of docker/awesome-compose plus Airflow, Sentry, Supabase, Appwrite, Kafka,
Temporal, Immich, Mastodon, GitLab, Nextcloud, Grafana, MinIO, Keycloak, Odoo,
Drupal, Moodle, Saleor, Vendure, Windmill, Dify, Directus and the rest: 12,111
lines) and against `docker compose config` itself rather than against an
assumption. That comparison is what found the last defect, after I had already
written the opposite conclusion.
95 of the 109 now parse as they are, up from 90. Of the 14 that do not, 5 are
refused by Docker too, 7 are pod port collisions that `--no-pod` accepts, and 2
diverge on purpose.
Added
- A container-only port is accepted, as a DECLARED port. `ports: ["8000"]` and
`ports: ["${UNSET}:8000"]` were refused; Docker normalises both to target
8000 with no published port and assigns an ephemeral one at up. kern has no
ephemeral allocator, and inventing one would publish a port the file never
named on a number nobody can predict, so the entry joins the pod-wide space
`expose:` and `port:` already feed, with a warning saying so. Supabase,
Budibase, Jitsi and OpenCTI reach this form through an unset variable.
Fixed
- A `depends_on` typo was silently dropped: the pruning loop removed every
absent name, so the topological sort never saw it. A name skipped by an
inactive profile is still pruned; one never defined is now refused and
quoted, as Docker refuses it.
- An `image:` beginning with `-` was accepted by compose while the docker shim
refused the identical string as flag injection.
- A per-service `networks:` with no top-level block passed in silence, and
then said the same thing once per service. Stated once per run.
- "`services:` is empty" was the answer for a file with ten services, all
behind inactive profiles. Right outcome, wrong noun.
- An empty file was answered with a TOML noun for a document saved as .yml.
- The installer gave up on a WSL2 distro whose curl uses c-ares and whose AAAA
lookup stalls. One IPv4 retry, saying why. `kern pull` was never affected.
- examples/benchmark.py took over ten minutes: 1000 runs per runtime is three
seconds for kern and five minutes for docker. 118 s now, same numbers.
- Fourteen examples slept a fixed second waiting for a box that was already
up. They poll the condition now: copy-files 1041 ms to 35, serve-with-port
5500 to 231.
637 Rust tests, 61 Python, 50 Node. clippy clean. 79 examples green.
v0.6.20
kern 0.6.20 One fix, found on a Raspberry Pi 5 two hours after 0.6.19 shipped. The `docker` shim was broken through a symlink, for every non-root user. Installed the way the README documents: ln -s "$(command -v kern)" ~/.local/bin/docker docker run --rm alpine echo hi -> error: usage: kern run: unknown flag (put `--` before the command) kern re-execs itself under `systemd-run --scope` to apply cgroup caps, and that path is taken by an ordinary user, not by root. The re-exec replayed the argv the user TYPED and located the binary with current_exe(), which resolves the symlink: the second pass received argv[0] = kern, no longer recognised itself as the shim, and handed untranslated docker syntax to kern's own `run` verb. Two independent losses that combine only through a symlink. As a copy named `docker` it worked, which is why every check run before a board ran it as a real user had passed. The re-exec now replays the argv kern DECIDED. `kern box --restart` had the same defect and worse consequences: it freezes the argv into a systemd unit, so docker syntax would have been written into a file that fails at every boot. Verified on the Pi 5, the Jetson Orin Nano and the Arduino UNO Q: 17/17 each, symlink and copy, `--device` still refused by name. 637 Rust tests, 61 Python, 50 Node, clippy clean.
v0.6.19
kern 0.6.19
Docker compose parity for web stacks, plus the defects that running the work
on real hardware exposed.
Added
- docker / docker-compose shim: invoked under either name, kern translates
the argv and runs an existing script unchanged. Every flag is forwarded,
dropped as a no-op, or refused by name. There is no fourth bucket where a
flag is silently ignored.
- kern compose, ten verbs over a docker-compose.yml or a kern profile.
- kern compose <file> systemd: prints a unit, installs nothing, and says in
its own comments that it does not supervise.
- port: and Docker's expose:, declaring the port a service listens on inside
the pod. kern reserves it and passes port: as PORT.
Fixed
- kern stop waited the full grace period for a signal the box could not
receive: 9013 ms to stop one box. It now reads SigCgt and skips the
graceful phase when the init provably cannot catch the signal (4 ms), while
a service that does trap it still gets its full grace.
- kern stop --all deleted systemd unit files it had never written.
- compose config reported as clean a stack that up refused.
- docker compose up -d died on kern's usage text.
- The /dev/shm change from 0.6.19-pre is reverted: the leak it fixed does not
exist. The evidence was an echo after a semicolon, which runs whatever the
command before it did. Measuring the pre-fix binary showed the cap holding
all along.
636 Rust tests, 61 Python, 50 Node. clippy clean. Verified on x86_64 plus the
Pi 5, Jetson Orin Nano and Arduino UNO Q.
v0.6.18
OCI device-node compat, fail-closed
v0.6.15
kern 0.6.15: one-write cgroup subtree_control, finer setup timing
v0.6.14
kern 0.6.14 Everyday-CLI verb parity (rename/update/wait/diff/events) plus cgroup-pid1 resolution and aarch64/x86_64-musl rename portability fixes.
v0.6.13
kern 0.6.13 Schema: [[disk]] identifies with id (name kept as a back-compat alias). README pass on the 0.6.12 review.
v0.6.12
kern 0.6.12 Fix: kern config setup emits a backend on every generated vcpu profile so the starter config it tailors for a host passes kern validate. Docs: README architecture diagram, source links, limitations; CONFIG.md vgpio reference.
v0.6.11
kern 0.6.11: backend is now required on every resource profile
v0.6.10
kern 0.6.10: kern exec inherits the box's --memory/--pids caps