A reproducible “everything-in-one” development container built to run agentic CLI tools (Codex, Gemini CLI, Claude Code) alongside a full multi-language toolchain (Node/Java/PHP/Python/Perl/C/C++) plus Android + GIS + document/image utilities.
The container is intentionally configured to run as root (“yolo mode”) so you can install extra packages, tweak the environment, and let agents perform system-level tasks without friction. If anything gets messy, you can always revert by rebuilding the image from scratch.
Dockerfile— builds the image (toolchain + agent CLIs)docker-compose.yml— runs a long-lived interactive container with persisted agent auth/config
Agentic CLIs (and humans working with them) tend to need a grab-bag of capabilities:
- Clone repos, edit files, run builds/tests, generate patches
- Parse and transform PDFs, images, spreadsheets, and archives
- Compile native code and build polyglot projects
- Work with Android projects (Gradle + SDK tooling)
- Run GIS conversions and geoprocessing (GDAL/OGR)
- Persist logins/settings across container rebuilds
This image packages those capabilities in one place, reproducibly.
These are installed globally via npm:
- OpenAI Codex CLI (
codex) - Google Gemini CLI (
gemini) - Claude Code (
claude)
Usage is interactive: you exec into the container and run the agent you want.
Example inside the container:
codex --help
gemini --help
claude --help- Node.js (base image)
- Java (JDK 17) — required for Gradle/Android builds and many JVM projects
- PHP 8.2 + Composer — common PHP development stack
- Python 3 + pip — scripting, data processing, automation
- Perl + cpanminus — legacy tooling/scripts
- C/C++ build stack — compilers and build systems for native builds
build-essential,cmake,ninja,pkg-configgdb,strace
git,git-lfs,openssh-clientjq,ripgrep,fd(Debian package:fd-find),tree,less,bash-completionprocps,htop
- PDF:
poppler-utils(e.g.,pdftotext,pdfinfo,pdftoppm),qpdf - OCR:
tesseract-ocr - Excel-ish:
gnumeric(includesssconvert)
imagemagick,graphicsmagick,libvips-tools- Optimizers:
jpegoptim,optipng,pngquant,gifsicle,webp - Metadata/inspection:
exiftool - Vector graphics:
inkscape - Media:
ffmpeg
- Gradle + Kotlin
- Android command-line tools (
sdkmanager) - Baseline SDK components (platform-tools / build-tools / platform)
gdal-bin(GDAL/OGR CLI:gdalinfo,ogr2ogr,gdalwarp, etc.)proj-bin,geos-binspatialite-bin,sqlite3- Optional OSM utilities (if present in your Dockerfile):
osmctools,osmosis
This container intentionally runs as root so:
- Agents can install packages (apt/pip/npm) when needed
- You can debug/patch environments quickly
- Build systems that expect system-wide installs “just work”
Trade-off: root has full control inside the container and any mounted directories. Use responsibly.
If something breaks, you can revert instantly by rebuilding the container (see below).
Agent CLIs store credentials and settings in root’s home directory. To avoid re-authing on every rebuild, docker-compose.yml persists these paths via named volumes (Docker-managed storage):
- Claude Code:
/root/.claude - Gemini CLI:
/root/.gemini - Codex CLI:
/root/.codex
If you ever need to persist a single file (e.g., .../something.json) on Windows, prefer a host bind mount to an existing file. If the host path doesn’t exist as a file at container start, Docker may create a directory and break tools that expect a file.
To wipe all persisted logins and start clean:
docker compose down -v
docker compose up -d --builddocker compose up -d --builddocker compose exec codex bashcodex --version || true
gemini --version || true
claude --version || true
java -version
gradle -v
python3 --version
php -v
composer -V
gdalinfo --versionMount your project into /app/... in docker-compose.yml, then:
docker compose exec codex bash
cd /app/your-project
codex
# or:
gemini
# or:
claudeInside the container, in an Android project directory:
./gradlew assemble
./gradlew lintIf a tool complains about JAVA_HOME, set it once in the shell:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH="$PATH:$JAVA_HOME/bin"Rebuild image without cache:
docker compose build --no-cache
docker compose up -dAlso remove persisted volumes (full reset):
docker compose down -v
docker compose up -d --build