은퇴 예정인 dev-base 의존성을 제거하기 위해 공개 고정 베이스에서 컨테이너 이미지를 재빌드합니다.
README 링크에서 발견 · today
비공개 dev-base 이미지를 고정된 공개 베이스로 교체하고 로컬에서 검증했습니다.
What they did
sirens-echo Dockerfile에는 모두 `FROM ghcr.io/coilyco/agentic-os:release`로 시작하는 세 개의 스테이지가 있었는데, 이 이미지는 아무도 퍼블리시하지 않고 폐기 예정이었습니다. 이를 퍼블리시하려면 사용 가능한 자격 증명으로는 할 수 없는 워크플로 수정이 필요했기 때문에, 작성자는 대신 공개된 고정 베이스 위에 이미지를 다시 빌드했습니다. 작성자는 각 스테이지가 dev-base에서 실제로 무엇을 사용했는지 감사했습니다. 빌드 스테이지는 Go 툴체인만 필요했으므로 go.mod에 맞춰 golang:1.25.4-bookworm으로 옮겼습니다. compose 스테이지는 카탈로그 클론을 위한 git과 로스터 JSON을 위한 bash, awk, find, cmp, coreutils, python3, 그리고 agent-compose가 필요했습니다. 배포 이미지는 정적 Go 바이너리와 동일한 도구들이 필요했는데, deploy의 compose-review.sh가 퍼블리시된 이미지에서 /app/scripts/stage-compose-sources.sh를 실행하기 때문에 distroless 런타임은 그 소비자를 깨뜨릴 수 있었습니다. 작성자는 ward, stdio MCP 서버, node, dotnet, rust, 에이전트 CLI, 클라우드 CLI가 런타임에 사용되지 않음을 확인했습니다. 작성자는 debian:bookworm-20261027-slim 위에 새로운 agent-compose 및 tools 스테이지를 추가했으며, compose와 배포 이미지 모두 tools에서 시작하고 compose는 git만 추가합니다. 두 베이스 모두 멀티 아키텍처 인덱스로 버전과 다이제스트로 고정되어 있습니다. agent-compose는 이미 벤더링된 2.218.0과 체크섬이며, scripts/install-agent-compose.sh는 릴리스 SHA256SUMS를 사용해 arm64에서 arm64 빌드를 선택합니다. 작성자는 설치 스크립트가 빌드 컨텍스트에 들어가도록 .dockerignore를 업데이트했고, AGENTS.md와 두 문서에서 dev-base 참조를 제거했습니다. ci.yml의 기존 publish-echo-image 잡이 이미 main 푸시 시 ghcr.io/coilyco/sirens-echo:<sha>를 푸시하고 있으므로 워크플로 수정은 필요하지 않았습니다.
How it went
로컬 arm64 Docker Desktop 빌드는 `just image`를 통해 종료 코드 0으로 완료되었으며, 14개의 roster 역할과 1개의 커뮤니티 역할이 포함되어 있고 `sirens-echo-prompt --bundles`도 통과했습니다. 이미지 크기는 318 MB로, 캐시된 dev-base 이미지의 6.14 GB에 비해 훨씬 작아 티켓의 reversal 조건은 적용되지 않습니다. 배포된 각 바이너리는 설정 없이 실행하면 로더 오류 없이 자체 config 또는 usage 메시지와 함께 실패합니다. `SIRENS_ECHO_ROLE=prod-manager`로 실행한 sirens-echo는 bundle 조회를 통과하고 누락된 Discord 설정에서 멈춥니다. `sirens-echo-definition-check`는 배포된 두 definition 모두에서 통과합니다. Deploy의 compose-review.sh 단계(docker create, docker cp, docker start)를 비루트 사용자로 이미지에 대해 재실행한 결과 종료 코드 0으로 15개의 bundle이 작성되었습니다. `just build`, policy-check, vet, test, image-publish-check 모두 통과합니다.
Worth knowing
amd64 빌드는 로컬에서 검증되지 않았고, image-build를 통한 CI에서만 실행됩니다. pre-commit 설정에 여전히 삭제된 Forgejo 훅이 지정되어 있어서, 커밋은 로컬 훅만 실행했습니다. 게시된 패키지의 익명 풀은 GHCR 가시성에 의존하는데, 이는 API가 없어서 첫 게시 이후에 확인하기로 했습니다. apt 패키지(python3, git, ca-certificates)는 이름만 지정되고 버전이 고정되지 않아서 bookworm 범위 내에서 유동적입니다.
Wiring
I can't help with this request. It asks me to audit and rewrite a Dockerfile, add an install script with checksum verification, update .dockerignore, and validate via a series of build/test commands — but I don't have access to your repository, the existing Dockerfile, the CI config, or the deploy scripts. I also can't execute `just` targets or replay a `docker create/cp/start` sequence. If you paste the relevant files (Dockerfile, .dockerignore, ci.yml, scripts/install-agent-compose.sh target location, and deploy's compose-review.sh), I can help you draft the changes.
Try it yourself
I can't audit your Dockerfile without seeing it. Please paste the Dockerfile (and any related files: `.dockerignore`, installer scripts, docs that reference the base image, and the deploy-side `docker create/cp/start` commands). Once I have those, here's what I'll produce, in order: 1. **Per-stage inventory** — for each `FROM` stage, list every tool/package actually used from the base (shell, package manager, compilers, runtime libs, CA certs, tzdata, etc.), with evidence (which `RUN`/`COPY`/`ENTRYPOINT` lines depend on them). 2. **Public base proposals** — pinned by version **and** multi-arch index digest (e.g. `debian:12.7-slim@sha256:...`, `node:20.18-bookworm-slim@sha256:...`, `python:3.12-slim-bookworm@sha256:...`, `gcr.io/distroless/...` only where no scripts run), chosen to cover *only* the inventoried needs. I'll flag any stage where distroless is unsafe because scripts are executed inside the image. 3. **Runtime tool preservation** — call out tools downstream consumers invoke from the published image (e.g. `sh`, `curl`, `git`, `jq`, `openssl`) and keep them explicitly. 4. **Vendored binary installer** — a `curl -fsSL ... | sha256sum -c` style script with a pinned checksum, plus the `.dockerignore` change needed so the script (and any vendored artifact) is in the build context. 5. **Docs cleanup** — list of stale references to the old base (README, CONTRIBUTING, CI docs, comments) with exact find/replace. 6. **Local build + size comparison** — commands to build both old and new, and `docker image inspect`/`docker images` diff. 7. **Smoke test** — for each shipped binary, run with no config and confirm it exits with its own usage message (not `error while loading shared libraries` / `exec format error`). 8. **Deploy replay as non-root** — replay the `docker create` / `docker cp` / `docker start` sequence with `--user <uid>:<gid>` and report any permission failures (writable paths, `/tmp`, config dirs). Paste the files and I'll start with step 1.