AI Docker Image
Für die ai- und ai-agent-Container wird ein separates Docker Image genutzt.
Dabei wird Claude Code im Dockerfile über NPM1 installiert und steht anschließend als CLI im Container zur Verfügung.
Neben der Installation der Claude Code CLI wird zusätzliche Software für die Nutzung der Claude Code Sandbox installiert.
Claude Code CLI
Abschnitt betitelt „Claude Code CLI“Claude Code CLI ist ein Terminal-basiertes Interface für Claude mit Code-Ausführung und Dateisystem-Zugriff.
- Interaktive Konversationen mit Claude direkt im Terminal
- Tools und MCP-Server Integration
- Direkter Zugriff auf Projektdateien
- Konfigurierbare Permissions und Sandbox-Einstellungen
Installation im Dockerfile
Abschnitt betitelt „Installation im Dockerfile“Bei der Installation gibt es zwei gängige Ansätze: Installation als root- oder als node-User
Installation als root-User
Abschnitt betitelt „Installation als root-User“Dockerfile
USER root
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}
USER nodeHier erfolgt die Installation als root. Anschließend wird in den node-User gewechselt, sodass Claude Code zur Laufzeit nicht mit Root-Rechten ausgeführt wird.
In einem gehärteten Container erhöht dies die Integrität der global installierten CLI.
Vorteil:
Die installierten Dateien gehören root und sind damit für den node-User nicht veränderbar.
Hintergrund:
Ein möglicher Angriffspunkt ohne diese Einschränkung wäre, dass kompromittierter Anwendungscode oder fehlerhafte Dependencies zur Laufzeit globale CLI-Binaries überschreiben oder manipulieren könnten.
Installation als node-User
Abschnitt betitelt „Installation als node-User“Dockerfile
USER root
RUN mkdir -p /usr/local/share/npm-global \ && chown -R node:node /usr/local/share/npm-global
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-globalENV PATH=$PATH:/usr/local/share/npm-global/bin
USER node
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}Diese Variante folgt dem Prinzip “Least Privilege auch zur Build-Zeit” und orientiert sich am offiziellen Claude Code Development Container sowie am Gemini CLI Container.
Dabei wird ein eigener globaler npm-Pfad eingerichtet, der dem node-User gehört. Die Installation erfolgt anschließend ohne Root-Rechte.
Vorteil:
Die Installation erfolgt ohne Root-Rechte
Nachteil:
Der node-User kann den globalen npm-Pfad zur Laufzeit verändern. Damit könnten globale CLI-Binaries durch nachgelagerten Code überschrieben oder manipuliert werden.
Bewertung
Abschnitt betitelt „Bewertung“Beide Varianten sind technisch valide. Die Entwicklungsumgebung dieser Guideline orientiert sich am Vorgehen der offiziellen Container für Node-basierte CLIs:
- Sowohl das offizielle Claude Code Dockerfile als auch das Gemini CLI Dockerfile installieren die jeweilige CLI als
node-User in einem eigenen npm-Prefix unter/usr/local/share/npm-global - Damit ergibt sich ein für Node-basierte CLI-Container etablierter Standard, der Installationen ohne Root-Rechte ermöglicht und einen klar definierten Pfad für globale Tools bereitstellt
Sandbox im gehärteten Container
Abschnitt betitelt „Sandbox im gehärteten Container“Claude Code nutzt bubblewrap als zusätzliche2 Sandbox. Diese Sandbox sorgt dafür, dass ein ausgeführter Prozess nur auf bestimmte Dateien zugreifen darf und der Netzwerkzugriff eingeschränkt wird.
Für den Netzwerkzugriff verwendet Claude Code zusätzlich socat. Dabei wird der Netzwerkverkehr des Prozesses in der Sandbox über einen lokalen Proxy geleitet, der anhand der Sandbox-Settings entscheidet, welche Domains erlaubt oder blockiert sind.
Dockerfile
...RUN apt-get update \ && apt-get install -y --no-install-recommends \ bubblewrap \ socat \...Einschränkung auf Docker Desktop (macOS)
Abschnitt betitelt „Einschränkung auf Docker Desktop (macOS)“Bubblewrap wurde primär für Szenarien entwickelt, in denen Prozesse direkt auf einem Linux-System isoliert werden müssen. In der Umgebung dieser Guideline läuft Claude Code jedoch bereits innerhalb eines gehärteten Docker-Containers mit cap_drop: ALL, no-new-privileges=true und dem Default-Seccomp-Filter von Docker.
Diese Hardening-Optionen verhindern, dass Bubblewrap die für seine OS-Level-Isolation benötigten User-Namespaces erstellen kann.
Selbst mit enableWeakerNestedSandbox aktiviert konnte die Sandbox im Setup dieser Guideline nicht zuverlässig in Betrieb genommen werden - neben den Capability- und Seccomp-Restriktionen kommen weitere Faktoren wie die Erwartung bestimmter Verzeichnisstrukturen (.git/hooks/) und bekannte Issues der aktuellen Claude Code Implementierung hinzu.
Eine Aktivierung wäre nur möglich, wenn man dem Container privilegierte Rechte gibt (etwa
seccomp=unconfinedund weitere Lockerungen). Das würde jedoch dem Hardening-Ansatz dieser Guideline widersprechen.
Abwägung: Bubblewrap vs. Docker-Härtung
Abschnitt betitelt „Abwägung: Bubblewrap vs. Docker-Härtung“Eine vollständige Aktivierung von Bubblewrap würde zusätzliche privilegierte Rechte im Container erfordern. Damit würde die äußere Isolationsschicht geschwächt, um eine zusätzliche innere Schicht zu ermöglichen.
Bubblewrap und socat verbleiben im Image
Abschnitt betitelt „Bubblewrap und socat verbleiben im Image“Auch wenn die Sandbox aktuell nicht aktiviert ist, bleiben bubblewrap und socat im AI Docker Image installiert.
Damit ist die Sandbox-Funktionalität im Image grundsätzlich verfügbar und kann mit einer zukünftigen Claude Code Version oder in einer weniger restriktiven Umgebung ohne Image-Änderung aktiviert werden.
Footnotes
Abschnitt betitelt „Footnotes“-
Die Installation über NPM ist als
deprecatedgekennzeichnet, wird jedoch im Dockerfile des offiziellen Claude Code Dev Container ebenfalls genutzt. ↩ -
Siehe offizielles Dev Container Dockerfile von Claude Code ↩