mirror of
https://github.com/kvcache-ai/AgentENV.git
synced 2026-11-05 01:17:36 +00:00
[PR #416] feat(compose): add the guest Compose runtime image #420
Labels
No labels
bug
documentation
enhancement
enhancement
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
kvcache-ai/AgentENV#420
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/kvcache-ai/AgentENV/pull/416
Author: @Primary33
Created: 10/22/2026
Status: 🔄 Open
Base:
main← Head:feat/compose-guest-runtime📝 Commits (1)
bc95e36feat(compose): add the guest Compose runtime image📊 Changes
5 files changed (+104 additions, -0 deletions)
View changed files
➕
compose-image/Dockerfile(+44 -0)➕
compose-image/Dockerfile.dockerignore(+7 -0)➕
compose-image/containerd.toml(+11 -0)➕
compose-image/daemon.json(+10 -0)➕
compose-image/init(+32 -0)📄 Description
What
Add
compose-image/Dockerfile, the guest base image for Compose sandboxes.Why
Run Docker Compose services on separately mounted service root filesystems inside a sandbox.
Related issue
Guest-image part of the #349 split. Independent of planner #415; #349 integrates both and is the only consumer of this image.
Scope and non-goals
Only
compose-image/(Dockerfile,init,containerd.toml,daemon.json,Dockerfile.dockerignore); no Rust or Go code. The server drives startup through envd in #349. Publishing the image is out of scope: operators build it and setcompose.base_image.Design and behavior changes
/initas PID 1./initre-executes under tini (docker-init), then starts plain-snapshotter, containerd and dockerd in order, waiting for each socket. Daemon logs go to/var/log/agentenv-compose/./initstays alive if a daemon fails, so the guest does not panic; the server reports readiness failures./initexits unless it runs as tini's child, so a second run (for example as an image start command) cannot replace the live snapshotter socket./usr/bin/env,/usr/local/bin/docker,/usr/local/bin/plain-snapshotter, and Docker'splainstorage driver.Compatibility and operations
compose.base_image.docker build -f compose-image/Dockerfile .;Dockerfile.dockerignorelimits the context to these files and the snapshotter sources; the build downloads Debian packages, Docker static binaries and the Compose plugin (both pinned by SHA-256). linux/amd64 only; runs on the default AgentENV guest kernel. Docker's raw-table direct-access filter is disabled viaallow-direct-routing: sandbox ingress always targets the guest address, so the filter adds no isolation and would otherwise requireCONFIG_IP_NF_RAWin the guest kernel.Validation
On the designated Ubuntu test host. Its Docker daemon runs with
--bridge none, so the build uses--network=hostand container checks use--network=none.docker build --network=host -f compose-image/Dockerfile .— passed (40.0 kB build context).sh -n /initpasses; all binaries the server and/inituse are present;/init,/etc/containerd/config.tomland/etc/docker/daemon.jsonmatch the repository files byte for byte; Docker 28.4.0, Compose v2.39.4, iptables-legacy./initoutside tini's child printsagentenv-compose: /init must run as the guest initand exits 1.python3 compose-image/test_e2e.py -v(integrated in #349) — 3 passed in 87.2 s on the default guest kernel (vmlinux-6.1.175). Guest logs show the three daemons started in order andstorage-driver=plain.Skipped checks and reasons: Rust and Go checks do not apply; this PR changes no Rust or Go code.
Risks and reviewer notes
A daemon crash after startup is not reported; the sandbox stays Running with Docker unavailable. Restarting is unsafe because the snapshotter's active snapshots are in memory.
Checklist
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.