Docker(オプション)

Dockerはオプションです。コンテナ化されたGatewayが必要な場合、またはDockerフローを検証する場合にのみ使用してください。

Dockerは私に適していますか?

  • はい: 分離された使い捨てGateway環境が必要な場合、またはローカルインストールなしでホスト上でOpenClawを実行したい場合。
  • いいえ: 自分のマシンで実行していて、最速の開発ループが必要な場合。代わりに通常のインストールフローを使用してください。
  • サンドボックスの注意: エージェントサンドボックスもDockerを使用しますが、完全なGatewayをDockerで実行する必要はありませんSandboxingを参照してください。

このガイドでカバーする内容:

  • コンテナ化されたGateway(Docker内の完全なOpenClaw)
  • セッションごとのエージェントサンドボックス(ホストGateway + Docker分離されたエージェントツール)

サンドボックスの詳細: Sandboxing

必要要件

  • Docker Desktop(またはDocker Engine)+ Docker Compose v2
  • イメージ + ログ用の十分なディスク容量

コンテナ化されたGateway(Docker Compose)

クイックスタート(推奨)

リポジトリのルートから:

./docker-setup.sh

このスクリプトは:

  • Gatewayイメージをビルド
  • オンボーディングウィザードを実行
  • オプションのプロバイダーセットアップヒントを表示
  • Docker Compose経由でGatewayを起動
  • Gatewayトークンを生成し、.envに書き込み

オプションの環境変数:

  • OPENCLAW_DOCKER_APT_PACKAGES — ビルド中に追加のaptパッケージをインストール
  • OPENCLAW_EXTRA_MOUNTS — 追加のホストバインドマウントを追加
  • OPENCLAW_HOME_VOLUME/home/nodeを名前付きボリュームで永続化

完了後:

  • ブラウザでhttp://127.0.0.1:18789/を開きます。
  • Control UI(Settings → token)にトークンを貼り付けます。

ホスト上にconfig/workspaceを書き込みます:

  • ~/.openclaw/
  • ~/.openclaw/workspace

VPS上で実行していますか?Hetzner (Docker VPS)を参照してください。

手動フロー(compose)

docker build -t openclaw:local -f Dockerfile .
docker compose run --rm openclaw-cli onboard
docker compose up -d openclaw-gateway

追加マウント(オプション)

追加のホストディレクトリをコンテナにマウントしたい場合は、 docker-setup.shを実行する前にOPENCLAW_EXTRA_MOUNTSを設定します。これは カンマ区切りのDockerバインドマウントリストを受け入れ、docker-compose.extra.ymlを生成して openclaw-gatewayopenclaw-cliの両方に適用します。

例:

export OPENCLAW_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.sh

注意:

  • パスはmacOS/WindowsのDocker Desktopと共有する必要があります。
  • OPENCLAW_EXTRA_MOUNTSを編集する場合は、docker-setup.shを再実行して 追加のcomposeファイルを再生成してください。
  • docker-compose.extra.ymlは生成されます。手動で編集しないでください。

コンテナホーム全体の永続化(オプション)

コンテナ再作成後も/home/nodeを永続化したい場合は、 OPENCLAW_HOME_VOLUME経由で名前付きボリュームを設定します。これはDockerボリュームを作成し、 /home/nodeにマウントし、標準のconfig/workspaceバインドマウントを保持します。ここでは 名前付きボリュームを使用してください(バインドパスではない)。バインドマウントには OPENCLAW_EXTRA_MOUNTSを使用してください。

例:

export OPENCLAW_HOME_VOLUME="openclaw_home"
./docker-setup.sh

追加マウントと組み合わせることができます:

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

注意:

  • OPENCLAW_HOME_VOLUMEを変更する場合は、docker-setup.shを再実行して 追加のcomposeファイルを再生成してください。
  • 名前付きボリュームはdocker volume rm <name>で削除するまで永続化されます。

追加aptパッケージのインストール(オプション)

イメージ内にシステムパッケージが必要な場合(例: ビルドツールまたはメディアライブラリ)、 docker-setup.shを実行する前にOPENCLAW_DOCKER_APT_PACKAGESを設定します。 これはイメージビルド中にパッケージをインストールするため、 コンテナが削除されても永続化されます。

例:

export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg build-essential"
./docker-setup.sh

注意:

  • これはスペース区切りのaptパッケージ名リストを受け入れます。
  • OPENCLAW_DOCKER_APT_PACKAGESを変更する場合は、docker-setup.shを再実行して イメージを再ビルドしてください。

より速いリビルド(推奨)

リビルドを高速化するには、依存関係レイヤーがキャッシュされるようにDockerfileを並べ替えます。 これにより、ロックファイルが変更されない限りpnpm installの再実行を回避できます:

FROM node:22-bookworm

# Bunのインストール(ビルドスクリプトに必要)
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"

RUN corepack enable

WORKDIR /app

# パッケージメタデータが変更されない限り依存関係をキャッシュ
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"]

チャネルセットアップ(オプション)

CLIコンテナを使用してチャネルを設定し、必要に応じてGatewayを再起動します。

WhatsApp(QR):

docker compose run --rm openclaw-cli channels login

Telegram(ボットトークン):

docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"

Discord(ボットトークン):

docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"

ドキュメント: WhatsAppTelegramDiscord

ヘルスチェック

docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"

E2Eスモークテスト(Docker)

scripts/e2e/onboard-docker.sh

QRインポートスモークテスト(Docker)

pnpm test:docker:qr

注意事項

  • GatewayバインドはコンテナでのデフォルトHTTP_BIND_DEFAULT (lan)
  • Gatewayコンテナはセッションの正式な情報源です(~/.openclaw/agents/<agentId>/sessions/)。

エージェントサンドボックス(ホストGateway + Dockerツール)

詳細: Sandboxing

機能

agents.defaults.sandboxが有効な場合、非mainセッションはDocker内でツールを実行します。 Gatewayはホスト上に留まりますが、ツール実行は分離されます:

  • scope: デフォルトで"agent"(エージェントごとに1つのコンテナ + ワークスペース)
  • scope: "session"でセッションごとの分離
  • scopeごとのワークスペースフォルダを/workspaceにマウント
  • オプションのエージェントワークスペースアクセス(agents.defaults.sandbox.workspaceAccess
  • allow/denyツールポリシー(denyが優先)
  • インバウンドメディアはアクティブなサンドボックスワークスペース(media/inbound/*)にコピーされるため、ツールが読み取れます(workspaceAccess: "rw"の場合、エージェントワークスペースに配置されます)

警告: scope: "shared"はセッション間分離を無効にします。すべてのセッションが1つのコンテナと1つのワークスペースを共有します。

エージェントごとのサンドボックスプロファイル(マルチエージェント)

マルチエージェントルーティングを使用する場合、各エージェントはサンドボックス + ツール設定をオーバーライドできます: agents.list[].sandboxagents.list[].tools(およびagents.list[].tools.sandbox.tools)。これにより、1つのGatewayで混合アクセスレベルを実行できます:

  • フルアクセス(個人エージェント)
  • 読み取り専用ツール + 読み取り専用ワークスペース(家族/仕事エージェント)
  • ファイルシステム/シェルツールなし(公開エージェント)

例、優先順位、トラブルシューティングについてはMulti-Agent Sandbox & Toolsを参照してください。

デフォルトの動作

  • Image: openclaw-sandbox:bookworm-slim
  • エージェントごとに1つのコンテナ
  • エージェントワークスペースアクセス: workspaceAccess: "none"(デフォルト)は~/.openclaw/sandboxesを使用
    • "ro"はサンドボックスワークスペースを/workspaceに保持し、エージェントワークスペースを読み取り専用で/agentにマウントします(write/edit/apply_patchを無効化)
    • "rw"はエージェントワークスペースを読み書き可能で/workspaceにマウントします
  • 自動プルーニング: アイドル > 24時間 または 経過時間 > 7日
  • Network: デフォルトでnone(明示的にオプトインが必要な場合のみエグレス)
  • デフォルトallow: execprocessreadwriteeditsessions_listsessions_historysessions_sendsessions_spawnsession_status
  • デフォルトdeny: browsercanvasnodescrondiscordgateway

サンドボックスの有効化

setupCommandでパッケージをインストールする予定の場合は、注意してください:

  • デフォルトのdocker.network"none"(エグレスなし)。
  • readOnlyRoot: trueはパッケージインストールをブロックします。
  • userapt-getにはrootである必要があります(userを省略するか、user: "0:0"を設定)。 OpenClawはsetupCommand(またはDocker設定)が変更されると自動的にコンテナを再作成します コンテナが最近使用された(約5分以内)場合を除きます。ホットコンテナは 正確なopenclaw sandbox recreate ...コマンドで警告をログに記録します。
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        scope: "agent", // session | agent | shared (agentがデフォルト)
        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でアイドルプルーニングを無効化
          maxAgeDays: 7  // 0で最大経過時間プルーニングを無効化
        }
      }
    }
  },
  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"]
      }
    }
  }
}

強化ノブはagents.defaults.sandbox.dockerの下にあります: networkuserpidsLimitmemorymemorySwapcpusulimitsseccompProfileapparmorProfilednsextraHosts

マルチエージェント: agents.list[].sandbox.{docker,browser,prune}.*経由でエージェントごとにagents.defaults.sandbox.{docker,browser,prune}.*をオーバーライド (agents.defaults.sandbox.scope / agents.list[].sandbox.scope"shared"の場合は無視されます)。

デフォルトサンドボックスイメージのビルド

scripts/sandbox-setup.sh

これはDockerfile.sandboxを使用してopenclaw-sandbox:bookworm-slimをビルドします。

サンドボックス共通イメージ(オプション)

共通ビルドツール(Node、Go、Rustなど)を含むサンドボックスイメージが必要な場合は、共通イメージをビルドします:

scripts/sandbox-common-setup.sh

これはopenclaw-sandbox-common:bookworm-slimをビルドします。使用するには:

{
  agents: { defaults: { sandbox: { docker: { image: "openclaw-sandbox-common:bookworm-slim" } } } }
}

サンドボックスブラウザイメージ

サンドボックス内でブラウザツールを実行するには、ブラウザイメージをビルドします:

scripts/sandbox-browser-setup.sh

これはDockerfile.sandbox-browserを使用してopenclaw-sandbox-browser:bookworm-slimをビルドします。コンテナはCDP有効のChromiumと オプションのnoVNCオブザーバー(Xvfb経由のヘッドフル)を実行します。

注意:

  • ヘッドフル(Xvfb)はヘッドレスよりもボットブロッキングを削減します。
  • ヘッドレスはagents.defaults.sandbox.browser.headless=trueを設定することで引き続き使用できます。
  • 完全なデスクトップ環境(GNOME)は不要です。Xvfbがディスプレイを提供します。

設定を使用:

{
  agents: {
    defaults: {
      sandbox: {
        browser: { enabled: true }
      }
    }
  }
}

カスタムブラウザイメージ:

{
  agents: {
    defaults: {
      sandbox: { browser: { image: "my-openclaw-browser" } }
    }
  }
}

有効にすると、エージェントは以下を受け取ります:

  • サンドボックスブラウザコントロールURL(browserツール用)
  • noVNC URL(有効でheadless=falseの場合)

注意: ツールにallowリストを使用する場合は、browserを追加し(denyから削除)、そうでないとツールがブロックされたままです。 プルーニングルール(agents.defaults.sandbox.prune)はブラウザコンテナにも適用されます。

カスタムサンドボックスイメージ

独自のイメージをビルドし、設定をそれに向けます:

docker build -t my-openclaw-sbx -f Dockerfile.sandbox .
{
  agents: {
    defaults: {
      sandbox: { docker: { image: "my-openclaw-sbx" } }
    }
  }
}

ツールポリシー(allow/deny)

  • denyallowより優先されます。
  • allowが空の場合: すべてのツール(denyを除く)が利用可能です。
  • allowが空でない場合: allow内のツールのみが利用可能です(denyを除く)。

プルーニング戦略

2つのノブ:

  • prune.idleHours: X時間使用されていないコンテナを削除(0 = 無効)
  • prune.maxAgeDays: X日より古いコンテナを削除(0 = 無効)

例:

  • 忙しいセッションを保持しつつ寿命を制限: idleHours: 24maxAgeDays: 7
  • プルーニングしない: idleHours: 0maxAgeDays: 0

セキュリティ注意事項

  • ハードウォールはツールにのみ適用されます(exec/read/write/edit/apply_patch)。
  • browser/camera/canvasのようなホスト専用ツールはデフォルトでブロックされます。
  • サンドボックスでbrowserを許可すると分離が破られます(ブラウザはホスト上で実行されます)。

トラブルシューティング

  • イメージが見つからない: scripts/sandbox-setup.shでビルドするか、agents.defaults.sandbox.docker.imageを設定してください。
  • コンテナが実行されていない: 必要に応じてセッションごとに自動作成されます。
  • サンドボックス内のパーミッションエラー: マウントされたワークスペースの所有権と一致するUID:GIDにdocker.userを設定してください(またはワークスペースフォルダのchownを実行)。
  • カスタムツールが見つからない: OpenClawはsh -lc(ログインシェル)でコマンドを実行し、/etc/profileをソースし、PATHをリセットする場合があります。カスタムツールパスを先頭に追加するためにdocker.env.PATHを設定してください(例: /custom/bin:/usr/local/share/npm-global/bin)、またはDockerfileで/etc/profile.d/の下にスクリプトを追加してください。