agent-container/CHANGELOG.md
Jeena fcbfa32545 container: Stop gracefully on podman stop
Containers used `sleep infinity` as PID 1, which never reacts to
SIGTERM: the kernel does not apply default signal dispositions to PID 1,
and sleep has no SIGTERM handler, so every `podman stop` silently
ignored the signal, waited out the full 10-second grace period, and fell
back to SIGKILL.

PID 1 now traps TERM and INT itself and exits on request, so one-off
manual stops of a still-running agent container end immediately instead
of after the kill timeout.

The PID 1 command is baked in at create time, so containers predating
this change are detected and recreated automatically on the next run.
2026-10-29 18:56:22 +09:00

2.7 KiB

Release notes

1.0.1 — 2026-10-29

podman stop now stops a running agent container immediately instead of after a 10-second SIGTERM timeout followed by SIGKILL.

Why

Containers used sleep infinity as PID 1. The kernel does not apply default signal dispositions to PID 1, and sleep has no SIGTERM handler, so the stop signal was silently ignored and every stop fell through to SIGKILL. PID 1 now traps TERM (and INT) itself and exits on request:

trap "exit 0" TERM INT; sleep infinity & wait

Upgrading

The PID 1 command is baked in when a container is created, so existing containers are detected on the next run and recreated automatically. Nothing in the container home is touched.

1.0.0 — 2026-10-29

Containers now run with rootless Podman instead of Docker.

Why

Whoever can talk to /var/run/docker.sock is root on the host. A single docker run --privileged -v /:/host edits any file, including /etc/shadow and your SSH keys. Being in the docker group is therefore the same as having root, and an agent with that access leaves the project directory whenever it likes — the confinement this tool exists for holds only against accidents, not against a malicious tool call.

Rootless Podman removes the shortcut: containers run inside a user namespace owned by you, and container root maps to a subordinate UID from /etc/subuid instead of to host root. Nothing outside your own file permissions is reachable, and the docker group is not needed at all.

Upgrading

Rootless Podman has to work on the host first:

sudo pacman -S podman passt            # or slirp4netns
grep "^$USER:" /etc/subuid /etc/subgid # expect an entry like 100000:65536
podman info >/dev/null && echo ok

If the subuid/subgid entries are missing, add them with usermod --add-subuids 100000-165535 --add-subgids 100000-165535 <user>.

Existing Docker containers and images are not reused. They are left untouched, and the first Podman run builds a fresh image (localhost/agent-container:latest).

  1. Rebuild the image with Podman:

    git pull
    agent-container update
    
  2. Remove the old Docker containers and image:

    docker ps -a --filter 'name=^ac-' --format '{{.Names}}' | xargs -r docker rm -f
    docker rmi agent-container:latest
    
  3. Use pi, claude, and opencode as before. The first run creates a Podman container per project.

  4. Leave the docker group once nothing else on the machine needs the socket as your user, then log out and in again:

    sudo gpasswd -d "$USER" docker
    

Your container home ($XDG_DATA_HOME/agent-container/container-home) is untouched: logins, settings, and history carry over.