Skip to content

Releases: getkern/kern

v0.6.21

Choose a tag to compare

@github-actions github-actions released this 28 Jul 20: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

Choose a tag to compare

@github-actions github-actions released this 28 Jul 19:10
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

Choose a tag to compare

@github-actions github-actions released this 28 Jul 17:58
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

Choose a tag to compare

@github-actions github-actions released this 26 Jul 11:53
OCI device-node compat, fail-closed

v0.6.15

Choose a tag to compare

@github-actions github-actions released this 26 Jul 08:00
kern 0.6.15: one-write cgroup subtree_control, finer setup timing

v0.6.14

Choose a tag to compare

@github-actions github-actions released this 23 Jul 17:52
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

Choose a tag to compare

@github-actions github-actions released this 22 Jul 22:16
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

Choose a tag to compare

@github-actions github-actions released this 22 Jul 20:59
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

Choose a tag to compare

@github-actions github-actions released this 22 Jul 18:12
kern 0.6.11: backend is now required on every resource profile

v0.6.10

Choose a tag to compare

@github-actions github-actions released this 22 Jul 17:30
kern 0.6.10: kern exec inherits the box's --memory/--pids caps