build: add Dockerfile.azkaban with the site's tools #83
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/dockerfile-azkaban"
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?
Why
This repository builds the company website with Jekyll, and contributors
often work on it through coding agents run in azkaban, a launcher that
keeps each agent in a rootless Podman container. azkaban's stock image
has no Ruby and ships Node 22, so an agent there could not run the
project's Setup command (
bundle install && npm install -g terser) norits Verify command (
make build && .agents/hooks/shellcheck.sh repo):every check had to be repeated on the host before merging an agent's
branch. CONTRIBUTING.md described a git-ignored
Dockerfile.claude-jailthat each contributor built and selected by hand, and its example
installed neither Ruby nor Node 24.
azkaban now builds a workspace
Dockerfile.azkabanitself, on top ofthe client image, once the user approves its content, so the tools can
live in a tracked file. Set aside: Ubuntu's
ruby-full(not Ruby4.0.7), compiling Ruby with ruby-build (minutes on every rebuild), and
copying the client's home onto a separate tools image (tied to Claude
and to azkaban's internals).
What changed
Before, an agent in azkaban had no Ruby and the wrong Node. Now, after
the user approves
Dockerfile.azkabanat the first launch, the agent'simage carries Ruby 4.0.7 with the bundle already installed and Node 24
with terser; Python 3, Git, jq, and ShellCheck already come with
azkaban's image.
Ruby with the bundle and Node with terser are built in stages
independent of the client image, so a refresh of azkaban's client
image rebuilds only the final copies. The bundle installs as UID 1000,
since a change to
Gemfile, which the agent can edit, rebuilds thatstage at the next launch without a new approval. Global npm packages
go to the client's
~/.local, the place the agent's Bash sandbox maywrite.
CONTRIBUTING.md § Running agents in azkaban now describes the tracked
file in place of
Dockerfile.claude-jailandAZKABAN_CLAUDE_IMAGE;.gitignoreand.dockerignoredropDockerfile.claude-jail, and.dockerignorekeepsDockerfile.azkabanout of the production buildcontext.
How to verify
./install.sh claude)and a clone of this repository.
master: from the clone, runclaude ., then in thesession
! ruby -v; it printsruby: command not found, and! node -vprintsv22.x.git switch --detach feat/dockerfile-azkaban, thenclaude .; approveDockerfile.azkabanwhen asked and wait for thebuild. In the session:
! ruby -v && node -v && which terserprintsruby 4.0.7…,v24.x, and/home/claude/.local/bin/terser;! bundle install && npm install -g terserends withBundle complete!and no error;! make build && .agents/hooks/shellcheck.sh repobuilds_site/and prints
shell check: … files clean.git switch master.Checks run: step 2 matches the stock azkaban container (no
ruby, Nodev22.23.4); step 3 in azkaban on this branch's tree, which
passed;
.agents/hooks/shellcheck.sh repoon each commit, clean; therepository has no test suite.
Considerations
The final image carries no compiler: after a
Gemfile.lockchange, thenext launch rebuilds the bundle, and until then
bundle installin thecontainer installs only gems that need no compiling. The
rubyandnodeimage tags are one more place to bump with.ruby-versionand.nvmrc; the stage comments say so.