Docker (optionnel)
Docker est optionnel. Utilisez-le uniquement si vous souhaitez une passerelle containerisee ou valider le flux Docker.
Docker est-il fait pour vous ?
- Oui : vous voulez un environnement de passerelle isole et jetable, ou executer OpenClaw sur un hote sans installations locales.
- Non : vous travaillez sur votre propre machine et voulez la boucle de developpement la plus rapide. Utilisez plutot le flux dâinstallation classique.
- Note sur le sandboxing : le sandboxing des agents utilise aussi Docker, mais il ne necessite pas que la passerelle complete tourne dans Docker. Consultez Sandboxing.
Ce guide couvre :
- Passerelle containerisee (OpenClaw complet dans Docker)
- Sandbox dâagent par session (passerelle sur lâhote + outils dâagent isoles via Docker)
Details du sandboxing : Sandboxing
Pre-requis
- Docker Desktop (ou Docker Engine) + Docker Compose v2
- Au moins 2 Go de RAM pour la construction de lâimage (
pnpm installpeut etre tue par OOM sur les hotes a 1 Go avec exit 137) - Suffisamment dâespace disque pour les images + logs
- Si vous executez sur un VPS/hote public, consultez
Renforcement de la securite pour lâexposition reseau,
en particulier la politique pare-feu Docker
DOCKER-USER.
Passerelle containerisee (Docker Compose)
Demarrage rapide (recommande)
Remarque : Les valeurs par defaut Docker ici supposent des modes de liaison (
lan/loopback), pas des alias dâhote. Utilisez les valeurs de mode de liaison dansgateway.bind(par exemplelanouloopback), pas des alias dâhote comme0.0.0.0oulocalhost.
Depuis la racine du depot :
./docker-setup.sh
Ce script :
- construit lâimage de la passerelle localement (ou tire une image distante si
OPENCLAW_IMAGEest defini) - lance lâassistant dâaccueil
- affiche des indications optionnelles pour la configuration des fournisseurs
- demarre la passerelle via Docker Compose
- genere un token de passerelle et lâecrit dans
.env
Variables dâenvironnement optionnelles :
OPENCLAW_IMAGEâ utiliser une image distante au lieu de compiler localement (par ex.ghcr.io/openclaw/openclaw:latest)OPENCLAW_DOCKER_APT_PACKAGESâ installer des paquets apt supplementaires pendant la constructionOPENCLAW_EXTENSIONSâ pre-installer les dependances dâextensions au moment de la construction (noms dâextensions separes par des espaces, par ex.diagnostics-otel matrix)OPENCLAW_EXTRA_MOUNTSâ ajouter des montages bind supplementaires de lâhoteOPENCLAW_HOME_VOLUMEâ persister/home/nodedans un volume nommeOPENCLAW_SANDBOXâ activer le bootstrap sandbox de la passerelle Docker. Seules les valeurs explicitement vraies lâactivent :1,true,yes,onOPENCLAW_INSTALL_DOCKER_CLIâ argument de construction pour les builds locaux dâimage (1installe le CLI Docker dans lâimage).docker-setup.shle definit automatiquement quandOPENCLAW_SANDBOX=1pour les builds locaux.OPENCLAW_DOCKER_SOCKETâ chemin du socket Docker personnalise (par defaut : cheminDOCKER_HOST=unix://..., sinon/var/run/docker.sock)OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1â mode derogatoire : autoriser les ciblesws://de reseau prive de confiance pour les chemins client CLI/accueil (par defaut : loopback uniquement)OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0â desactiver les drapeaux de renforcement du navigateur conteneurise--disable-3d-apis,--disable-software-rasterizer,--disable-gpusi vous avez besoin de compatibilite WebGL/3D.OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0â garder les extensions activees quand les flux du navigateur les necessitent (par defaut, les extensions sont desactivees dans le navigateur sandbox).OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>â definir la limite de processus de rendu Chromium ; mettez0pour ne pas passer le drapeau et utiliser le comportement par defaut de Chromium.
Une fois termine :
- Ouvrez
http://127.0.0.1:18789/dans votre navigateur. - Collez le token dans lâinterface de controle (Parametres â token).
- Besoin de lâURL a nouveau ? Executez
docker compose run --rm openclaw-cli dashboard --no-open.
Activer le sandbox dâagent pour la passerelle Docker (opt-in)
docker-setup.sh peut aussi configurer agents.defaults.sandbox.* pour les
deploiements Docker.
Activez avec :
export OPENCLAW_SANDBOX=1
./docker-setup.sh
Chemin de socket personnalise (par exemple Docker rootless) :
export OPENCLAW_SANDBOX=1
export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock
./docker-setup.sh
Notes :
- Le script monte
docker.sockuniquement apres validation des pre-requis sandbox. - Si la configuration sandbox ne peut pas etre completee, le script reinitialise
agents.defaults.sandbox.modeaoffpour eviter une configuration sandbox obsolete/cassee lors des re-executions. - Si
Dockerfile.sandboxest manquant, le script affiche un avertissement et continue ; construisezopenclaw-sandbox:bookworm-slimavecscripts/sandbox-setup.shsi necessaire. - Pour les valeurs non locales de
OPENCLAW_IMAGE, lâimage doit deja contenir le support du CLI Docker pour lâexecution sandbox.
Automatisation/CI (non-interactif, pas de bruit TTY)
Pour les scripts et le CI, desactivez lâallocation pseudo-TTY de Compose avec -T :
docker compose run -T --rm openclaw-cli gateway probe
docker compose run -T --rm openclaw-cli devices list --json
Si votre automatisation nâexporte pas de variables de session Claude, les laisser non definies
se resout desormais en valeurs vides par defaut dans docker-compose.yml pour eviter les
avertissements repetes âvariable is not setâ.
Note de securite reseau partage (CLI + passerelle)
openclaw-cli utilise network_mode: "service:openclaw-gateway" pour que les commandes CLI puissent
atteindre de facon fiable la passerelle via 127.0.0.1 dans Docker.
Considerez cela comme une frontiere de confiance partagee : la liaison loopback nâest pas une isolation entre ces deux
conteneurs. Si vous avez besoin dâune separation plus forte, executez les commandes depuis un conteneur/chemin reseau hote
separe au lieu du service openclaw-cli fourni.
Pour reduire lâimpact en cas de compromission du processus CLI, la configuration compose supprime
NET_RAW/NET_ADMIN et active no-new-privileges sur openclaw-cli.
Il ecrit la configuration/lâespace de travail sur lâhote :
~/.openclaw/~/.openclaw/workspace
Vous executez sur un VPS ? Consultez Hetzner (Docker VPS).
Utiliser une image distante (sauter la construction locale)
Les images pre-construites officielles sont publiees sur :
Utilisez le nom dâimage ghcr.io/openclaw/openclaw (pas les images Docker Hub
portant un nom similaire).
Tags courants :
mainâ dernier build depuismain<version>â builds de tags de release (par exemple2026.2.26)latestâ derniere release stable
Metadonnees de lâimage de base
Lâimage Docker principale utilise actuellement :
node:24-bookworm
Lâimage Docker publie desormais des annotations OCI de lâimage de base (le sha256 est un exemple et pointe vers la liste de manifestes multi-arch epinglee pour ce tag) :
org.opencontainers.image.base.name=docker.io/library/node:24-bookwormorg.opencontainers.image.base.digest=sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6borg.opencontainers.image.source=https://github.com/openclaw/openclaworg.opencontainers.image.url=https://openclaw.aiorg.opencontainers.image.documentation=https://docs.openclaw.ai/install/dockerorg.opencontainers.image.licenses=MITorg.opencontainers.image.title=OpenClaworg.opencontainers.image.description=OpenClaw gateway and CLI runtime container imageorg.opencontainers.image.revision=<git-sha>org.opencontainers.image.version=<tag-or-main>org.opencontainers.image.created=<rfc3339 timestamp>
Reference : Annotations dâimages OCI
Contexte de release : lâhistorique des tags de ce depot utilise deja Bookworm dans
v2026.2.22 et les tags anterieurs de 2026 (par exemple v2026.2.21, v2026.2.9).
Par defaut, le script de configuration construit lâimage depuis les sources. Pour tirer une image
pre-construite a la place, definissez OPENCLAW_IMAGE avant dâexecuter le script :
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
./docker-setup.sh
Le script detecte que OPENCLAW_IMAGE nâest pas la valeur par defaut openclaw:local et
execute docker pull au lieu de docker build. Tout le reste (accueil,
demarrage de la passerelle, generation du token) fonctionne de la meme maniere.
docker-setup.sh sâexecute toujours depuis la racine du depot car il utilise le
docker-compose.yml local et les fichiers utilitaires. OPENCLAW_IMAGE saute le temps de
construction de lâimage locale ; il ne remplace pas le workflow compose/setup.
Utilitaires shell (optionnel)
Pour une gestion quotidienne plus facile de Docker, installez ClawDock :
mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/shell-helpers/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.sh
Ajoutez a votre configuration shell (zsh) :
echo 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc
Utilisez ensuite clawdock-start, clawdock-stop, clawdock-dashboard, etc. Executez clawdock-help pour toutes les commandes.
Consultez le README ClawDock Helper pour les details.
Flux manuel (compose)
docker build -t openclaw:local -f Dockerfile .
docker compose run --rm openclaw-cli onboard
docker compose up -d openclaw-gateway
A noter : executez docker compose ... depuis la racine du depot. Si vous avez active
OPENCLAW_EXTRA_MOUNTS ou OPENCLAW_HOME_VOLUME, le script de configuration ecrit
docker-compose.extra.yml ; incluez-le quand vous utilisez Compose ailleurs :
docker compose -f docker-compose.yml -f docker-compose.extra.yml <command>
Token de lâinterface de controle + appairage (Docker)
Si vous voyez âunauthorizedâ ou âdisconnected (1008): pairing requiredâ, recuperez un lien de tableau de bord frais et approuvez le peripherique navigateur :
docker compose run --rm openclaw-cli dashboard --no-open
docker compose run --rm openclaw-cli devices list
docker compose run --rm openclaw-cli devices approve <requestId>
Plus de details : Dashboard, Peripheriques.
Montages supplementaires (optionnel)
Si vous voulez monter des repertoires hote supplementaires dans les conteneurs, definissez
OPENCLAW_EXTRA_MOUNTS avant dâexecuter docker-setup.sh. Cela accepte une
liste separee par des virgules de montages bind Docker et les applique a la fois a
openclaw-gateway et openclaw-cli en generant docker-compose.extra.yml.
Exemple :
export OPENCLAW_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.sh
Notes :
- Les chemins doivent etre partages avec Docker Desktop sur macOS/Windows.
- Chaque entree doit etre au format
source:target[:options]sans espaces, tabulations ni retours a la ligne. - Si vous modifiez
OPENCLAW_EXTRA_MOUNTS, relancezdocker-setup.shpour regenerer le fichier compose supplementaire. docker-compose.extra.ymlest genere. Ne le modifiez pas manuellement.
Persister le home complet du conteneur (optionnel)
Si vous voulez que /home/node persiste apres la recreation du conteneur, definissez un volume
nomme via OPENCLAW_HOME_VOLUME. Cela cree un volume Docker et le monte a
/home/node, tout en gardant les montages bind standard config/workspace. Utilisez un
volume nomme ici (pas un chemin bind) ; pour les montages bind, utilisez
OPENCLAW_EXTRA_MOUNTS.
Exemple :
export OPENCLAW_HOME_VOLUME="openclaw_home"
./docker-setup.sh
Vous pouvez combiner cela avec des montages supplementaires :
export OPENCLAW_HOME_VOLUME="openclaw_home"
export OPENCLAW_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.sh
Notes :
- Les volumes nommes doivent correspondre a
^[A-Za-z0-9][A-Za-z0-9_.-]*$. - Si vous changez
OPENCLAW_HOME_VOLUME, relancezdocker-setup.shpour regenerer le fichier compose supplementaire. - Le volume nomme persiste jusquâa suppression avec
docker volume rm <name>.
Installer des paquets apt supplementaires (optionnel)
Si vous avez besoin de paquets systeme dans lâimage (par exemple, des outils de compilation ou des
bibliotheques multimedia), definissez OPENCLAW_DOCKER_APT_PACKAGES avant dâexecuter docker-setup.sh.
Cela installe les paquets pendant la construction de lâimage, afin quâils persistent meme si le
conteneur est supprime.
Exemple :
export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg build-essential"
./docker-setup.sh
Notes :
- Cela accepte une liste de noms de paquets apt separes par des espaces.
- Si vous changez
OPENCLAW_DOCKER_APT_PACKAGES, relancezdocker-setup.shpour reconstruire lâimage.
Pre-installer les dependances dâextensions (optionnel)
Les extensions avec leur propre package.json (par ex. diagnostics-otel, matrix,
msteams) installent leurs dependances npm au premier chargement. Pour integrer ces
dependances dans lâimage, definissez OPENCLAW_EXTENSIONS avant
dâexecuter docker-setup.sh :
export OPENCLAW_EXTENSIONS="diagnostics-otel matrix"
./docker-setup.sh
Ou lors de la construction directe :
docker build --build-arg OPENCLAW_EXTENSIONS="diagnostics-otel matrix" .
Notes :
- Cela accepte une liste de noms de repertoires dâextensions separes par des espaces (sous
extensions/). - Seules les extensions avec un
package.jsonsont concernees ; les plugins legers sans en sont ignores. - Si vous changez
OPENCLAW_EXTENSIONS, relancezdocker-setup.shpour reconstruire lâimage.
Conteneur complet / utilisateur avance (opt-in)
Lâimage Docker par defaut est axee sur la securite et sâexecute en tant quâutilisateur non-root node.
Cela reduit la surface dâattaque, mais implique :
- pas dâinstallation de paquets systeme a lâexecution
- pas de Homebrew par defaut
- pas de navigateurs Chromium/Playwright inclus
Si vous voulez un conteneur plus complet, utilisez ces options opt-in :
- Persister
/home/nodepour que les telechargements de navigateurs et les caches dâoutils survivent :
export OPENCLAW_HOME_VOLUME="openclaw_home"
./docker-setup.sh
- Integrer les dependances systeme dans lâimage (reproductible + persistant) :
export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq"
./docker-setup.sh
- Installer les navigateurs Playwright sans
npx(evite les conflits de surcharge npm) :
docker compose run --rm openclaw-cli \
node /app/node_modules/playwright-core/cli.js install chromium
Si vous avez besoin que Playwright installe les dependances systeme, reconstruisez lâimage avec
OPENCLAW_DOCKER_APT_PACKAGES au lieu dâutiliser --with-deps a lâexecution.
- Persister les telechargements de navigateurs Playwright :
- Definissez
PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwrightdansdocker-compose.yml. - Assurez-vous que
/home/nodepersiste viaOPENCLAW_HOME_VOLUME, ou montez/home/node/.cache/ms-playwrightviaOPENCLAW_EXTRA_MOUNTS.
Permissions + EACCES
Lâimage sâexecute en tant que node (uid 1000). Si vous voyez des erreurs de permission sur
/home/node/.openclaw, assurez-vous que vos montages bind hote appartiennent a lâuid 1000.
Exemple (hote Linux) :
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace
Si vous choisissez de sâexecuter en tant que root par commodite, vous acceptez le compromis de securite.
Reconstructions plus rapides (recommande)
Pour accelerer les reconstructions, ordonnez votre Dockerfile afin que les couches de dependances soient en cache.
Cela evite de relancer pnpm install sauf si les lockfiles changent :
FROM node:24-bookworm
# Installer Bun (necessaire pour les scripts de build)
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"
RUN corepack enable
WORKDIR /app
# Mettre en cache les dependances sauf si les metadonnees de package changent
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
Configuration des canaux (optionnel)
Utilisez le conteneur CLI pour configurer les canaux, puis redemarrez la passerelle si necessaire.
WhatsApp (QR) :
docker compose run --rm openclaw-cli channels login
Telegram (token de bot) :
docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"
Discord (token de bot) :
docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"
Docs : WhatsApp, Telegram, Discord
OpenAI Codex OAuth (Docker headless)
Si vous choisissez OpenAI Codex OAuth dans lâassistant, il ouvre une URL de navigateur et tente
de capturer un callback sur http://127.0.0.1:1455/auth/callback. Dans Docker ou
les configurations headless, ce callback peut afficher une erreur de navigateur. Copiez lâURL complete de
redirection sur laquelle vous atterrissez et collez-la dans lâassistant pour terminer lâauthentification.
Verifications de sante
Points de terminaison de sonde du conteneur (pas dâauthentification requise) :
curl -fsS http://127.0.0.1:18789/healthz
curl -fsS http://127.0.0.1:18789/readyz
Alias : /health et /ready.
/healthz est une sonde de vivacite superficielle pour âle processus de passerelle est actifâ.
/readyz reste pret pendant la grace de demarrage, puis passe en 503 uniquement si les
canaux geres requis sont toujours deconnectes apres la grace ou se deconnectent plus tard.
Lâimage Docker inclut un HEALTHCHECK integre qui ping /healthz en
arriere-plan. En termes simples : Docker verifie continuellement si OpenClaw est toujours
reactif. Si les verifications echouent, Docker marque le conteneur comme unhealthy,
et les systemes dâorchestration (politique de redemarrage Docker Compose, Swarm, Kubernetes,
etc.) peuvent le redemarrer ou le remplacer automatiquement.
Instantane de sante approfondi authentifie (passerelle + canaux) :
docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"
Test de bout en bout (Docker)
scripts/e2e/onboard-docker.sh
Test dâimport QR (Docker)
pnpm test:docker:qr
LAN vs loopback (Docker Compose)
docker-setup.sh definit par defaut OPENCLAW_GATEWAY_BIND=lan pour que lâacces hote a
http://127.0.0.1:18789 fonctionne avec la publication de ports Docker.
lan(par defaut) : le navigateur hote + le CLI hote peuvent atteindre le port publie de la passerelle.loopback: seuls les processus a lâinterieur du namespace reseau du conteneur peuvent atteindre la passerelle directement ; lâacces au port publie sur lâhote peut echouer.
Le script de configuration fixe aussi gateway.mode=local apres lâaccueil pour que les commandes
CLI Docker ciblent par defaut le loopback local.
Note sur la configuration legacy : utilisez les valeurs de mode de liaison dans gateway.bind (lan / loopback /
custom / tailnet / auto), pas les alias dâhote (0.0.0.0, 127.0.0.1,
localhost, ::, ::1).
Si vous voyez Gateway target: ws://172.x.x.x:18789 ou des erreurs repetees pairing required
depuis les commandes CLI Docker, executez :
docker compose run --rm openclaw-cli config set gateway.mode local
docker compose run --rm openclaw-cli config set gateway.bind lan
docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789
Notes
- La liaison de la passerelle est par defaut
lanpour lâutilisation en conteneur (OPENCLAW_GATEWAY_BIND). - Le CMD du Dockerfile utilise
--allow-unconfigured; une configuration montee avecgateway.modedifferent delocaldemarrera quand meme. Surchargez le CMD pour forcer la garde. - Le conteneur de la passerelle est la reference pour les sessions (
~/.openclaw/agents/<agentId>/sessions/).
Modele de stockage
- Donnees hote persistantes : Docker Compose monte en bind
OPENCLAW_CONFIG_DIRvers/home/node/.openclawetOPENCLAW_WORKSPACE_DIRvers/home/node/.openclaw/workspace, de sorte que ces chemins survivent au remplacement du conteneur. - tmpfs sandbox ephemere : quand
agents.defaults.sandboxest active, les conteneurs sandbox utilisenttmpfspour/tmp,/var/tmpet/run. Ces montages sont separes du stack Compose principal et disparaissent avec le conteneur sandbox. - Points chauds de croissance disque : surveillez
media/,agents/<agentId>/sessions/sessions.json, les fichiers JSONL de transcription,cron/runs/*.jsonlet les logs fichier rotatifs sous/tmp/openclaw/(ou votrelogging.fileconfigure). Si vous executez aussi lâapp macOS en dehors de Docker, ses logs de service sont separes :~/.openclaw/logs/gateway.log,~/.openclaw/logs/gateway.err.loget/tmp/openclaw/openclaw-gateway.log.
Sandbox dâagent (passerelle hote + outils Docker)
Pour approfondir : Sandboxing
Fonctionnement
Quand agents.defaults.sandbox est active, les sessions non principales executent les outils dans un conteneur
Docker. La passerelle reste sur votre hote, mais lâexecution des outils est isolee :
- scope :
"agent"par defaut (un conteneur + espace de travail par agent) - scope :
"session"pour une isolation par session - dossier dâespace de travail par scope monte a
/workspace - acces optionnel a lâespace de travail de lâagent (
agents.defaults.sandbox.workspaceAccess) - politique dâoutils autoriser/refuser (le refus lâemporte)
- les medias entrants sont copies dans lâespace de travail sandbox actif (
media/inbound/*) pour que les outils puissent les lire (avecworkspaceAccess: "rw", cela arrive dans lâespace de travail de lâagent)
Attention : scope: "shared" desactive lâisolation inter-sessions. Toutes les sessions partagent
un conteneur et un espace de travail.
Profils sandbox par agent (multi-agent)
Si vous utilisez le routage multi-agent, chaque agent peut surcharger les parametres sandbox + outils :
agents.list[].sandbox et agents.list[].tools (plus agents.list[].tools.sandbox.tools). Cela vous permet dâexecuter
des niveaux dâacces mixtes sur une seule passerelle :
- Acces complet (agent personnel)
- Outils en lecture seule + espace de travail en lecture seule (agent familial/professionnel)
- Pas dâoutils de systeme de fichiers/shell (agent public)
Consultez Multi-Agent Sandbox & Tools pour les exemples, la priorite et le depannage.
Comportement par defaut
- Image :
openclaw-sandbox:bookworm-slim - Un conteneur par agent
- Acces a lâespace de travail de lâagent :
workspaceAccess: "none"(par defaut) utilise~/.openclaw/sandboxes"ro"garde lâespace de travail sandbox a/workspaceet monte lâespace de travail de lâagent en lecture seule a/agent(desactivewrite/edit/apply_patch)"rw"monte lâespace de travail de lâagent en lecture/ecriture a/workspace
- Nettoyage automatique : inactif > 24h OU age > 7j
- Reseau :
nonepar defaut (opt-in explicite si vous avez besoin de sortie)hostest bloque.container:<id>est bloque par defaut (risque de jonction de namespace).
- Autorise par defaut :
exec,process,read,write,edit,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status - Refuse par defaut :
browser,canvas,nodes,cron,discord,gateway
Activer le sandboxing
Si vous prevoyez dâinstaller des paquets dans setupCommand, notez :
- Le
docker.networkpar defaut est"none"(pas de sortie). docker.network: "host"est bloque.docker.network: "container:<id>"est bloque par defaut.- Mode derogatoire :
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true. readOnlyRoot: truebloque lâinstallation de paquets.userdoit etre root pourapt-get(omettezuserou definissezuser: "0:0"). OpenClaw recree automatiquement les conteneurs quandsetupCommand(ou la config docker) change sauf si le conteneur a ete recemment utilise (dans les ~5 minutes). Les conteneurs actifs journalisent un avertissement avec la commande exacteopenclaw sandbox recreate ....
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off | non-main | all
scope: "agent", // session | agent | shared (agent par defaut)
workspaceAccess: "none", // none | ro | rw
workspaceRoot: "~/.openclaw/sandboxes",
docker: {
image: "openclaw-sandbox:bookworm-slim",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp", "/var/tmp", "/run"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
setupCommand: "apt-get update && apt-get install -y git curl jq",
pidsLimit: 256,
memory: "1g",
memorySwap: "2g",
cpus: 1,
ulimits: {
nofile: { soft: 1024, hard: 2048 },
nproc: 256,
},
seccompProfile: "/path/to/seccomp.json",
apparmorProfile: "openclaw-sandbox",
dns: ["1.1.1.1", "8.8.8.8"],
extraHosts: ["internal.service:10.0.0.5"],
},
prune: {
idleHours: 24, // 0 desactive le nettoyage par inactivite
maxAgeDays: 7, // 0 desactive le nettoyage par age maximum
},
},
},
},
tools: {
sandbox: {
tools: {
allow: [
"exec",
"process",
"read",
"write",
"edit",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
},
},
},
}
Les options de renforcement se trouvent sous agents.defaults.sandbox.docker :
network, user, pidsLimit, memory, memorySwap, cpus, ulimits,
seccompProfile, apparmorProfile, dns, extraHosts,
dangerouslyAllowContainerNamespaceJoin (mode derogatoire uniquement).
Multi-agent : surchargez agents.defaults.sandbox.{docker,browser,prune}.* par agent via agents.list[].sandbox.{docker,browser,prune}.*
(ignore quand agents.defaults.sandbox.scope / agents.list[].sandbox.scope est "shared").
Construire lâimage sandbox par defaut
scripts/sandbox-setup.sh
Cela construit openclaw-sandbox:bookworm-slim en utilisant Dockerfile.sandbox.
Image sandbox commune (optionnel)
Si vous voulez une image sandbox avec des outils de compilation courants (Node, Go, Rust, etc.), construisez lâimage commune :
scripts/sandbox-common-setup.sh
Cela construit openclaw-sandbox-common:bookworm-slim. Pour lâutiliser :
{
agents: {
defaults: {
sandbox: { docker: { image: "openclaw-sandbox-common:bookworm-slim" } },
},
},
}
Image sandbox navigateur
Pour executer lâoutil navigateur dans le sandbox, construisez lâimage navigateur :
scripts/sandbox-browser-setup.sh
Cela construit openclaw-sandbox-browser:bookworm-slim en utilisant
Dockerfile.sandbox-browser. Le conteneur execute Chromium avec CDP active et
un observateur noVNC optionnel (affichage via Xvfb).
Notes :
- Lâaffichage (Xvfb) reduit le blocage par les bots par rapport au mode headless.
- Le mode headless peut toujours etre utilise en definissant
agents.defaults.sandbox.browser.headless=true. - Aucun environnement de bureau complet (GNOME) nâest necessaire ; Xvfb fournit lâaffichage.
- Les conteneurs navigateur utilisent par defaut un reseau Docker dedie (
openclaw-sandbox-browser) au lieu dubridgeglobal. - Lâoption
agents.defaults.sandbox.browser.cdpSourceRangepermet de restreindre lâingres CDP en bordure de conteneur par CIDR (par exemple172.21.0.1/32). - Lâacces observateur noVNC est protege par mot de passe par defaut ; OpenClaw fournit une URL de token observateur a duree limitee qui sert une page bootstrap locale et garde le mot de passe dans le fragment dâURL (et non dans les parametres dâURL).
- Les parametres par defaut du demarrage du conteneur navigateur sont conservateurs pour les charges partagees/conteneurisees, incluant :
--remote-debugging-address=127.0.0.1--remote-debugging-port=<derive de OPENCLAW_BROWSER_CDP_PORT>--user-data-dir=${HOME}/.chrome--no-first-run--no-default-browser-check--disable-3d-apis--disable-software-rasterizer--disable-gpu--disable-dev-shm-usage--disable-background-networking--disable-features=TranslateUI--disable-breakpad--disable-crash-reporter--metrics-recording-only--renderer-process-limit=2--no-zygote--disable-extensions- Si
agents.defaults.sandbox.browser.noSandboxest defini,--no-sandboxet--disable-setuid-sandboxsont aussi ajoutes. - Les trois drapeaux de renforcement graphique ci-dessus sont optionnels. Si votre charge a besoin
de WebGL/3D, definissez
OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0pour sâexecuter sans--disable-3d-apis,--disable-software-rasterizeret--disable-gpu. - Le comportement des extensions est controle par
--disable-extensionset peut etre desactive (active les extensions) viaOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0pour les pages dependantes des extensions ou les workflows lourds en extensions. --renderer-process-limit=2est aussi configurable avecOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT; mettez0pour laisser Chromium choisir sa limite de processus par defaut quand la concurrence du navigateur doit etre ajustee.
Les valeurs par defaut sont appliquees dans lâimage fournie. Si vous avez besoin de drapeaux Chromium differents, utilisez une image navigateur personnalisee et fournissez votre propre point dâentree.
Configuration a utiliser :
{
agents: {
defaults: {
sandbox: {
browser: { enabled: true },
},
},
},
}
Image navigateur personnalisee :
{
agents: {
defaults: {
sandbox: { browser: { image: "my-openclaw-browser" } },
},
},
}
Une fois active, lâagent recoit :
- une URL de controle du navigateur sandbox (pour lâoutil
browser) - une URL noVNC (si active et headless=false)
Nâoubliez pas : si vous utilisez une liste dâautorisation pour les outils, ajoutez browser (et retirez-le de
deny) sinon lâoutil reste bloque.
Les regles de nettoyage (agents.defaults.sandbox.prune) sâappliquent aussi aux conteneurs navigateur.
Image sandbox personnalisee
Construisez votre propre image et pointez la configuration vers elle :
docker build -t my-openclaw-sbx -f Dockerfile.sandbox .
{
agents: {
defaults: {
sandbox: { docker: { image: "my-openclaw-sbx" } },
},
},
}
Politique dâoutils (autoriser/refuser)
denylâemporte surallow.- Si
allowest vide : tous les outils (sauf deny) sont disponibles. - Si
allownâest pas vide : seuls les outils dansallowsont disponibles (moins deny).
Strategie de nettoyage
Deux options :
prune.idleHours: supprimer les conteneurs non utilises depuis X heures (0 = desactiver)prune.maxAgeDays: supprimer les conteneurs plus vieux que X jours (0 = desactiver)
Exemple :
- Garder les sessions actives mais limiter la duree de vie :
idleHours: 24,maxAgeDays: 7 - Ne jamais nettoyer :
idleHours: 0,maxAgeDays: 0
Notes de securite
- La barriere stricte ne sâapplique quâaux outils (exec/read/write/edit/apply_patch).
- Les outils hote uniquement comme browser/camera/canvas sont bloques par defaut.
- Autoriser
browserdans le sandbox casse lâisolation (le navigateur tourne sur lâhote).
Depannage
- Image manquante : construisez avec
scripts/sandbox-setup.shou definissezagents.defaults.sandbox.docker.image. - Conteneur non en cours dâexecution : il sera cree automatiquement par session a la demande.
- Erreurs de permission dans le sandbox : definissez
docker.usersur un UID:GID correspondant a la propriete de votre espace de travail monte (ou changez le proprietaire du dossier workspace). - Outils personnalises introuvables : OpenClaw execute les commandes avec
sh -lc(shell de connexion), qui source/etc/profileet peut reinitialiser PATH. Definissezdocker.env.PATHpour prependre vos chemins dâoutils personnalises (par ex./custom/bin:/usr/local/share/npm-global/bin), ou ajoutez un script sous/etc/profile.d/dans votre Dockerfile.