agents.defaults.sandbox est activé, mais le bac à sable est désactivé par défaut et n’exige pas que le Gateway lui-même s’exécute dans Docker. Les backends de bac à sable SSH et OpenShell sont également disponibles ; consultez Mise en bac à sable.
Vous hébergez plusieurs utilisateurs ? Consultez Hébergement mutualisé pour le modèle d’une cellule par locataire.
Prérequis
- Docker Desktop (ou Docker Engine) + Docker Compose v2
- Au moins 2 GB de RAM pour construire l’image (
pnpm installpeut être interrompu par manque de mémoire sur les hôtes disposant de 1 GB, avec le code de sortie 137) - Suffisamment d’espace disque pour les images et les journaux
- Sur un VPS ou un hôte public, consultez Renforcement de la sécurité pour l’exposition réseau, en particulier la chaîne de pare-feu Docker
DOCKER-USER
Gateway conteneurisé
Construire l’image
openclaw:local. Pour utiliser plutôt une image préconstruite :openclaw/openclaw :ghcr.io/openclaw/openclaw ou openclaw/openclaw et évitez les miroirs non officiels, qui ne partagent ni le calendrier de publication ni la politique de conservation d’OpenClaw. Étiquettes officielles : main, latest, <version> (par exemple 2026.2.26) et les étiquettes bêta telles que 2026.2.26-beta.1 (les versions bêta ne déplacent jamais latest/main). L’image par défaut main/latest/<version> inclut les plugins codex et diagnostics-otel. Une variante -browser (par exemple latest-browser) est également fournie avec Chromium préinstallé, ce qui est utile pour l’outil de navigateur en bac à sable sans installation de Playwright lors de la première exécution.Réexécuter hors connexion
--offline vérifie que OPENCLAW_IMAGE existe déjà localement, désactive les extractions et constructions implicites de Compose, puis exécute le processus normal : synchronisation de .env, correction des autorisations, intégration initiale, synchronisation de la configuration du Gateway et démarrage de Compose.Si OPENCLAW_SANDBOX=1, la configuration hors connexion vérifie également les images de bac à sable configurées par défaut et par agent sur le démon derrière OPENCLAW_DOCKER_SOCKET, y compris l’étiquette de contrat du navigateur sur les images de navigateur basées sur Docker. Si une image requise est absente ou obsolète, la configuration se termine sans modifier la configuration du bac à sable au lieu d’indiquer à tort une réussite.Terminer l’intégration initiale
- demande les clés d’API du fournisseur
- génère un jeton de Gateway et l’écrit dans
.env - crée le répertoire de la clé secrète du profil d’authentification
- démarre le Gateway via Docker Compose
openclaw-gateway (avec --no-deps --entrypoint node), car openclaw-cli partage l’espace de noms réseau du Gateway et ne fonctionne qu’une fois le conteneur du Gateway créé.Ouvrir l’interface de contrôle
http://127.0.0.1:18789/ et collez dans Settings le jeton écrit dans .env. Si vous avez configuré le conteneur pour utiliser l’authentification par mot de passe, utilisez plutôt ce mot de passe.Vous avez de nouveau besoin de l’URL ?Processus manuel
.git. Transmettez l’identité de la source comme arguments de construction,
comme illustré ci-dessus, afin que l’écran À propos de l’image indique le commit extrait et
un horodatage de construction. scripts/docker/setup.sh détermine et transmet automatiquement
ces deux valeurs.
docker compose depuis la racine du dépôt. Si vous avez activé OPENCLAW_EXTRA_MOUNTS ou OPENCLAW_HOME_VOLUME, le script de configuration écrit docker-compose.extra.yml ; incluez-le après tout fichier docker-compose.override.yml que vous gérez vous-même, par exemple -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.extra.yml.Mise à niveau des images de conteneur
Lorsque vous remplacez l’image OpenClaw tout en conservant le même état et la même configuration montés, le nouveau Gateway exécute avant d’être prêt les migrations de mise à niveau sûres au démarrage et la convergence des plugins. Les mises à niveau ordinaires des images ne devraient pas nécessiter une exécution distincte deopenclaw doctor --fix.
Si le démarrage ne peut pas effectuer ces réparations en toute sécurité, le Gateway se ferme au lieu de
signaler qu’il est opérationnel. Avec une politique de redémarrage, Docker, Podman ou Kubernetes peut indiquer
que le conteneur du Gateway redémarre. Conservez le volume d’état monté, puis exécutez
une fois la même image avec openclaw doctor --fix comme commande du conteneur, en utilisant les
mêmes montages d’état et de configuration que le Gateway :
Variables d’environnement
Variables facultatives acceptées parscripts/docker/setup.sh (et, pour le conteneur du Gateway, directement par docker-compose.yml) :
brew ; fournissez ces dépendances au moyen d’une image personnalisée ou installez-les manuellement. Utilisez OPENCLAW_IMAGE_APT_PACKAGES pour les dépendances empaquetées pour Debian et OPENCLAW_IMAGE_PIP_PACKAGES pour les dépendances Python (exécute python3 -m pip install --break-system-packages lors de la construction ; épinglez donc les versions et utilisez uniquement des index auxquels vous faites confiance).
Si Docker signale ResourceExhausted, cannot allocate memory, ou s’interrompt pendant tsdown, augmentez la limite de mémoire du constructeur Docker ou réessayez avec des tas explicites plus petits :
Images construites depuis les sources avec des plugins sélectionnés
OPENCLAW_EXTENSIONS sélectionne les identifiants de manifeste de Plugin dans le dépôt source ;
les noms de répertoires source existants sont également acceptés lorsqu’ils diffèrent. La construction
Docker résout une seule fois la sélection en répertoires source, installe les dépendances
de production et, lorsqu’un Plugin sélectionné est publié séparément avec
openclaw.build.bundledDist: false, compile son environnement d’exécution dans le répertoire
dist groupé racine. Ce conditionnement propre à Docker ne modifie pas le contrat d’artefact npm
ou ClawHub du Plugin. Les identifiants inconnus, non valides ou ambigus font échouer la construction
de l’image. Les identifiants connus réservés aux dépendances ou aux sources conservent leur préparation
existante des sources et des dépendances sans obtenir d’entrée dist racine compilée. Un Plugin
sélectionné avec des entrées de construction unifiées doit être compilé correctement ; les sources
et la sortie d’exécution des Plugins externes non sélectionnés sont supprimées.
Par exemple, ces commandes construisent des images Gateway autonomes, distinctes et
multi-architectures de FakeCo pour ClickClack, Slack et Microsoft Teams. ClawRouter fait
déjà partie de l’environnement d’exécution OpenClaw racine ; l’image ClickClack sélectionne donc
uniquement clickclack. L’argument de navigateur explicitement vide permet de conserver
l’image par défaut sans Chromium :
--platform linux/arm64 --load ou --platform linux/amd64 --load pour une
seule construction locale native. Une sortie multiplateforme ainsi que les SBOM et données
de provenance joints nécessitent un registre ou une autre sortie Buildx qui préserve les
attestations. Après l’envoi, inspectez le manifeste et déployez le condensat immuable plutôt
que l’étiquette mutable fondée sur le SHA source :
OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. Cela remplace le paquet compilé /app/dist/extensions/synology-chat correspondant pour le même identifiant de Plugin.
Observabilité
L’export OpenTelemetry est sortant depuis le conteneur Gateway vers votre collecteur OTLP ; il ne nécessite aucun port Docker publié. Pour inclure l’exportateur groupé dans une image construite localement :diagnostics-otel ; installez vous-même clawhub:@openclaw/diagnostics-otel uniquement si vous l’avez supprimé. Pour activer l’export, autorisez et activez le Plugin diagnostics-otel dans la configuration, puis définissez diagnostics.otel.enabled=true (consultez l’exemple complet dans Export OpenTelemetry). Les en-têtes d’authentification du collecteur passent par diagnostics.otel.headers, et non par les variables d’environnement Docker.
Les métriques Prometheus réutilisent le port Gateway déjà publié. Installez clawhub:@openclaw/diagnostics-prometheus, activez le Plugin diagnostics-prometheus, puis collectez :
/metrics distinct ni de chemin de proxy inverse non authentifié. Consultez Métriques Prometheus.
Contrôles d’intégrité
Points de terminaison de sonde du conteneur (aucune authentification requise) :HEALTHCHECK intégré de l’image interroge /healthz ; des échecs répétés marquent le conteneur comme unhealthy afin que les orchestrateurs puissent le redémarrer ou le remplacer.
Instantané d’intégrité approfondi authentifié :
LAN ou interface de bouclage
scripts/docker/setup.sh utilise par défaut OPENCLAW_GATEWAY_BIND=lan afin que http://127.0.0.1:18789 sur l’hôte fonctionne avec la publication de ports Docker.
lan(par défaut) : le navigateur et la CLI de l’hôte peuvent atteindre le port Gateway publié.loopback: seuls les processus situés dans l’espace de noms réseau du conteneur peuvent atteindre directement le Gateway.
gateway.bind (lan / loopback / custom / tailnet / auto), et non des alias d’hôte comme 0.0.0.0 ou 127.0.0.1.Fournisseurs locaux de l’hôte
Dans le conteneur,127.0.0.1 désigne le conteneur lui-même, et non l’hôte. Utilisez host.docker.internal pour les fournisseurs exécutés sur l’hôte :
docker-compose.yml associe host.docker.internal au Gateway de l’hôte sur Docker Engine pour Linux (Docker Desktop fournit le même alias sous macOS/Windows). Les services de l’hôte doivent écouter sur une adresse accessible par Docker :
docker run ? Ajoutez vous-même la même association, par exemple --add-host=host.docker.internal:host-gateway.
Backend Claude CLI dans Docker
L’image officielle ne préinstalle pas Claude Code. Installez-le et connectez-vous dans le conteneur avec l’utilisateurnode, puis rendez persistant le répertoire personnel de ce conteneur afin que les mises à niveau de l’image n’effacent pas le binaire ni l’état d’authentification.
Pour une nouvelle installation, activez un volume persistant /home/node avant d’exécuter la configuration :
.env — le script de configuration réécrit toujours .env à partir de l’environnement actuel du shell et des valeurs par défaut ; il ne lit pas ce fichier de lui-même :
.env contient des valeurs que votre shell ne peut pas charger, réexportez d’abord manuellement celles dont vous dépendez (OPENCLAW_IMAGE, ports, mode de liaison, chemins personnalisés, OPENCLAW_EXTRA_MOUNTS, bac à sable, omission de l’intégration). La surcouche générée monte le volume du répertoire personnel pour openclaw-gateway et openclaw-cli ; exécutez les commandes restantes avec cette surcouche (et d’abord docker-compose.override.yml, si vous en utilisez un) :
claude dans /home/node/.local/bin/claude. Indiquez ce chemin à OpenClaw :
claude-cli groupé :
OPENCLAW_HOME_VOLUME rend persistants l’installation native sous /home/node/.local/bin et /home/node/.local/share/claude, ainsi que les paramètres et l’authentification de Claude Code sous /home/node/.claude et /home/node/.claude.json. Rendre persistant uniquement /home/node/.openclaw ne suffit pas ; si vous utilisez OPENCLAW_EXTRA_MOUNTS au lieu d’un volume de répertoire personnel, montez tous ces chemins Claude dans les deux services.
Bonjour / mDNS
Le réseau en pont de Docker ne transmet généralement pas de manière fiable le multicast Bonjour/mDNS (224.0.0.251:5353). Lorsque OPENCLAW_DISABLE_BONJOUR n’est pas défini, le Plugin Bonjour groupé désactive automatiquement la diffusion LAN dès qu’il détecte son exécution dans un conteneur, afin d’éviter une boucle de plantage due aux nouvelles tentatives de multicast abandonnées par le pont. Définissez OPENCLAW_DISABLE_BONJOUR=1 pour forcer sa désactivation indépendamment de la détection, ou 0 pour forcer son activation (uniquement avec le réseau de l’hôte, macvlan ou un autre réseau où le multicast mDNS est réputé fonctionner).
Sinon, utilisez l’URL Gateway publiée, Tailscale ou le DNS-SD étendu pour les hôtes Docker. Consultez Découverte Bonjour pour connaître les pièges et les procédures de dépannage.
Stockage et persistance
Docker Compose monte par liaisonOPENCLAW_CONFIG_DIR sur /home/node/.openclaw, OPENCLAW_WORKSPACE_DIR sur /home/node/.openclaw/workspace et OPENCLAW_AUTH_PROFILE_SECRET_DIR sur /home/node/.config/openclaw, afin que ces chemins survivent au remplacement du conteneur. Lorsqu’une variable n’est pas définie, docker-compose.yml utilise un chemin de secours sous ${HOME}, ou sous /tmp si HOME lui-même est absent, de sorte que docker compose up ne génère jamais de spécification de volume avec une source vide dans les environnements minimaux.
Ce répertoire de configuration monté contient :
openclaw.jsonpour la configuration du comportementagents/<agentId>/agent/auth-profiles.jsonpour l’authentification OAuth/par clé d’API stockée des fournisseurs.envpour les secrets d’exécution fournis par l’environnement, tels queOPENCLAW_GATEWAY_TOKEN
OPENCLAW_CONFIG_DIR.
Les Plugins téléchargeables installés stockent l’état de leurs paquets sous le répertoire personnel OpenClaw monté, de sorte que les enregistrements d’installation et les racines des paquets survivent au remplacement du conteneur ; le démarrage du Gateway ne régénère pas les arborescences de dépendances des Plugins groupés.
Pour obtenir tous les détails sur la persistance des machines virtuelles, consultez Environnement d’exécution de machine virtuelle Docker — Emplacements des données persistantes.
Principales sources de croissance du disque : media/, les bases de données SQLite propres à chaque agent, les transcriptions JSONL de sessions héritées, la base de données d’état SQLite partagée, les racines de paquets des Plugins installés et les journaux de fichiers tournants sous /tmp/openclaw/.
Assistants shell (facultatif)
Pour raccourcir les commandes quotidiennes, installez ClawDock :scripts/shell-helpers/clawdock-helpers.sh, réexécutez la commande ci-dessus afin que votre assistant local suive l’emplacement actuel. Utilisez ensuite clawdock-start, clawdock-stop, clawdock-dashboard, etc. (exécutez clawdock-help pour obtenir la liste complète).
Activer le bac à sable de l’agent pour le Gateway Docker
Activer le bac à sable de l’agent pour le Gateway Docker
docker.sock uniquement une fois les prérequis du bac à sable validés. Si la configuration du bac à sable ne peut pas aboutir, il réinitialise agents.defaults.sandbox.mode à off. Le mode code de Codex est désactivé pour les tours durant lesquels le bac à sable OpenClaw est actif (voir Mise en bac à sable § Backend Docker) ; ne montez jamais le socket Docker de l’hôte dans les conteneurs de bac à sable des agents.Automatisation / CI (non interactif)
Automatisation / CI (non interactif)
-T :Remarque de sécurité concernant le réseau partagé
Remarque de sécurité concernant le réseau partagé
openclaw-cli utilise network_mode: "service:openclaw-gateway" afin que les commandes CLI puissent atteindre le Gateway via 127.0.0.1. Considérez cela comme une frontière de confiance partagée. La configuration Compose retire NET_RAW/NET_ADMIN et active no-new-privileges pour openclaw-gateway et openclaw-cli.Échecs DNS de Docker Desktop dans openclaw-cli
Échecs DNS de Docker Desktop dans openclaw-cli
openclaw-cli utilisant le réseau partagé après le retrait de NET_RAW, ce qui se manifeste par EAI_AGAIN pendant les commandes s’appuyant sur npm, telles que openclaw plugins install. Conservez le fichier Compose renforcé par défaut pour le fonctionnement normal. La surcharge ci-dessous restaure les capacités par défaut uniquement pour le conteneur openclaw-cli : utilisez-la pour la commande ponctuelle nécessitant un accès au registre, et non comme invocation par défaut :openclaw-cli de longue durée, recréez-le avec la même surcharge : docker compose exec/docker exec ne peut pas modifier les capacités Linux d’un conteneur déjà créé.Autorisations et EACCES
Autorisations et EACCES
node (uid 1000). Si vous rencontrez des erreurs d’autorisation sur /home/node/.openclaw, assurez-vous que vos montages liés depuis l’hôte appartiennent à l’uid 1000 :blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root), suivi de plugin present but blocked : l’uid du processus et le propriétaire du répertoire du Plugin monté ne correspondent pas. Privilégiez l’exécution avec l’uid 1000 par défaut et corrigez la propriété du montage lié. Ne changez la propriété de /path/to/openclaw-config/npm en root:root que si vous exécutez intentionnellement OpenClaw en tant que root à long terme.Reconstructions plus rapides
Reconstructions plus rapides
pnpm install sauf si les fichiers de verrouillage changent :Options de conteneur pour utilisateurs avancés
Options de conteneur pour utilisateurs avancés
node non-root. Pour disposer d’un conteneur plus complet :- Conserver
/home/node:export OPENCLAW_HOME_VOLUME="openclaw_home" - Intégrer les dépendances système :
export OPENCLAW_IMAGE_APT_PACKAGES="git curl jq" - Intégrer les dépendances Python :
export OPENCLAW_IMAGE_PIP_PACKAGES="requests==2.32.5 humanize==4.14.0" - Intégrer Chromium pour Playwright :
export OPENCLAW_INSTALL_BROWSER=1, ou utilisez l’étiquette d’image officielle-browser - Ou installer les navigateurs Playwright dans un volume persistant :
- Conserver les téléchargements de navigateurs : utilisez
OPENCLAW_HOME_VOLUMEouOPENCLAW_EXTRA_MOUNTS. Sous Linux, OpenClaw détecte automatiquement le Chromium de l’image géré par Playwright.
OAuth OpenAI Codex (Docker sans interface graphique)
OAuth OpenAI Codex (Docker sans interface graphique)
Métadonnées de l’image de base
Métadonnées de l’image de base
node:24-bookworm-slim et exécute tini en tant que PID 1 afin que les processus zombies soient récupérés et que les signaux soient correctement gérés dans les conteneurs de longue durée. Elle publie des annotations d’image de base OCI, notamment org.opencontainers.image.base.name et org.opencontainers.image.source. Dependabot actualise le condensat épinglé de l’image de base Node ; les builds de publication n’exécutent pas de couche distincte de mise à niveau de la distribution. Voir Annotations d’image OCI.Exécution sur un VPS ?
Consultez Hetzner (VPS Docker) et Environnement d’exécution de VM Docker pour connaître les étapes de déploiement sur une VM partagée, notamment l’intégration des binaires, la persistance et les mises à jour.Bac à sable de l’agent
Lorsqueagents.defaults.sandbox est activé avec le backend Docker, le Gateway exécute les outils de l’agent (shell, lecture/écriture de fichiers, etc.) dans des conteneurs Docker isolés, tandis que le Gateway lui-même reste sur l’hôte : une séparation stricte autour des sessions d’agent non fiables ou mutualisées, sans conteneuriser l’ensemble du Gateway.
La portée du bac à sable peut être définie par agent (valeur par défaut), par session ou être partagée ; chaque portée dispose de son propre espace de travail monté dans /workspace. Vous pouvez également configurer des politiques d’autorisation ou de refus des outils, l’isolation réseau, les limites de ressources et les conteneurs de navigateur.
Pour obtenir la configuration complète, les images, les remarques de sécurité et les profils multi-agents :
- Mise en bac à sable — référence complète du bac à sable
- OpenShell — accès interactif au shell des conteneurs de bac à sable
- Bac à sable et outils multi-agents — remplacements par agent
Activation rapide
docker build intégrées.
Dépannage
Image manquante ou conteneur de bac à sable ne démarrant pas
Image manquante ou conteneur de bac à sable ne démarrant pas
scripts/sandbox-setup.sh (dépôt source extrait) ou la commande docker build intégrée provenant de Mise en bac à sable § Images et configuration (installation npm), ou définissez agents.defaults.sandbox.docker.image sur votre image personnalisée. Les conteneurs sont créés automatiquement par session à la demande.Erreurs d’autorisation dans le bac à sable
Erreurs d’autorisation dans le bac à sable
docker.user sur un UID:GID correspondant au propriétaire de votre espace de travail monté, ou modifiez le propriétaire du dossier de l’espace de travail.Outils personnalisés introuvables dans le bac à sable
Outils personnalisés introuvables dans le bac à sable
sh -lc (shell de connexion), qui charge /etc/profile et peut réinitialiser PATH. Définissez docker.env.PATH afin de placer en tête les chemins de vos outils personnalisés, ou ajoutez un script sous /etc/profile.d/ dans votre Dockerfile.Processus arrêté pour mémoire insuffisante pendant la construction de l’image (code de sortie 137)
Processus arrêté pour mémoire insuffisante pendant la construction de l’image (code de sortie 137)
Non autorisé ou appairage requis dans l’interface de contrôle
Non autorisé ou appairage requis dans l’interface de contrôle
La cible du Gateway affiche ws://172.x.x.x ou la CLI Docker rencontre des erreurs d’appairage
La cible du Gateway affiche ws://172.x.x.x ou la CLI Docker rencontre des erreurs d’appairage
Contenu associé
- Présentation de l’installation — toutes les méthodes d’installation
- Podman — alternative à Docker avec Podman
- ClawDock — configuration communautaire de Docker Compose
- Mise à jour — maintenir OpenClaw à jour
- Configuration — configuration du Gateway après l’installation