DockerSandbox
ローカルマシン上の Docker コンテナ内でコマンドを実行します。長時間稼働するコンテナと docker exec を使用します。クラウド Sandbox が不要なローカル開発、CI/CD、エアギャップ環境、コスト重視の用途に適しています。インターフェースの詳細は、WorkspaceSandbox インターフェースを参照してください。
インストールインストールへの直接リンク
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/docker
pnpm add @mastra/docker
yarn add @mastra/docker
bun add @mastra/docker
ホストマシンで Docker Engine が動作している必要があります。
使用方法使用方法への直接リンク
Workspace に DockerSandbox を追加して Agent に割り当てます。
import { Agent } from '@mastra/core/agent'
import { Workspace } from '@mastra/core/workspace'
import { DockerSandbox } from '@mastra/docker'
const workspace = new Workspace({
sandbox: new DockerSandbox({
image: 'node:22-slim',
}),
})
const agent = new Agent({
id: 'dev-agent',
name: 'dev-agent',
model: 'anthropic/claude-opus-4-7',
workspace,
})
コンストラクターパラメーターコンストラクターパラメーターへの直接リンク
id?:
name?:
--name として Docker に渡すコンテナの表示名。[a-zA-Z0-9_.-] 以外の文字は - に置換され、先頭が英数字でない場合は接頭辞が付加されます。image?:
command?:
env?:
volumes?:
network?:
privileged?:
memory?:
memorySwap?:
cpuQuota?:
cpuPeriod?:
pidsLimit?:
readonlyRootfs?:
capDrop?:
capAdd?:
securityOpt?:
ulimits?:
tmpfs?:
workingDir?:
labels?:
timeout?:
dockerOptions?:
instructions?:
プロパティプロパティへの直接リンク
id:
name:
provider:
status:
container:
processes:
バックグラウンドプロセスバックグラウンドプロセスへの直接リンク
DockerSandbox には、バックグラウンドプロセスを起動・管理するプロセスマネージャーが組み込まれています。プロセスは docker exec を使用してコンテナ内で動作します。
const sandbox = new DockerSandbox({ id: 'dev-sandbox' })
await sandbox._start()
// Spawn a background process
const handle = await sandbox.processes.spawn('node server.js', {
env: { PORT: '3000' },
onStdout: data => console.log(data),
})
// Interact with the process
console.log(handle.stdout)
await handle.sendStdin('input\n')
await handle.kill()
完全な API は、SandboxProcessManager リファレンスを参照してください。
環境変数環境変数への直接リンク
コンテナレベルの環境変数は env で設定します。プロセスの起動時には、コマンドごとの環境変数も渡せます。
const sandbox = new DockerSandbox({
image: 'node:22-slim',
env: {
NODE_ENV: 'production',
DATABASE_URL: 'postgres://localhost:5432/mydb',
},
})
バインドマウントバインドマウントへの直接リンク
volumes オプションを使用して、ホストのディレクトリをコンテナにマウントします。
const sandbox = new DockerSandbox({
image: 'node:22-slim',
volumes: {
'/my/project': '/workspace/project',
'/shared/data': '/data',
},
})
バインドマウントはコンテナ作成時に適用されます。ホストパスは Sandbox の起動前に存在している必要があります。
ハードニングハードニングへの直接リンク
Docker 固有のリソースオプションとハードニングオプションを使用して、Sandbox コンテナを制限します。次の例では、メモリとプロセス数に上限を設け、同じ cpuPeriod と cpuQuota の値で CPU を1コアに制限します。Linux capability を削除し、ルート Filesystem を読み取り専用にしたうえで、/tmp を書き込み可能な作業領域としてマウントします。
const sandbox = new DockerSandbox({
image: 'node:22-slim',
memory: 512 * 1024 * 1024,
memorySwap: 512 * 1024 * 1024,
cpuPeriod: 100_000,
cpuQuota: 100_000,
pidsLimit: 256,
readonlyRootfs: true,
capDrop: ['ALL'],
capAdd: ['NET_BIND_SERVICE'],
securityOpt: ['no-new-privileges:true'],
ulimits: [{ name: 'nofile', soft: 1024, hard: 2048 }],
tmpfs: {
'/tmp': 'rw,noexec,nosuid,size=64m',
},
})
これらのオプションは Docker の HostConfig フィールドへ直接対応し、明示的に渡した場合にのみ設定されます。
ハードニングを有効にする前に、次のトレードオフを確認してください。
readonlyRootfs:コンテナ内でのパッケージインストールや、マウント済みパスの外部へ書き込む Tool は失敗することがあります。/tmpなどの書き込み可能な作業パスにはtmpfsエントリを追加し、必要に応じて~/.npmなどのパッケージマネージャーキャッシュ用に tmpfs またはボリュームをマウントしてください。capDrop:すべての capability を削除すると、pingやマウント操作など、Linux capability が必要なコマンドは無効になります。FUSE ベースの Tool も無効になります。ワークロードに必要な capability だけを追加し直してください。memory:Docker は0を無制限として扱います。メモリ上限が不要な場合にのみmemoryを省略するか0を渡してください。memorySwap:Docker のメモリとスワップの動作は、ホストと Docker デーモンの設定によって異なります。memorySwapなしでmemoryを設定すると、Docker はデフォルトでメモリ上限の2倍までスワップを許可します。コンテナのスワップを無効にするには、memorySwapをmemoryと同じ値に設定してください。無制限のスワップには-1も指定できます。pidsLimit:各コマンドが長時間稼働するコンテナ内で追加プロセスを起動するため、値が小さすぎるとdocker execのワークロードが動作しなくなることがあります。privileged:特権コンテナは capability とセキュリティオプションの制御を迂回します。ワークロードで必要な場合を除き、privileged: trueを capability やセキュリティオプションと併用しないでください。- 再接続:
DockerSandboxは Sandbox ID が一致すると既存コンテナを再利用し、調査したHostConfigのハードニング値が異なる場合は警告します。変更したハードニングオプションを適用するには、Sandbox を破棄して再作成してください。Docker は調査時の値を正規化することがあります。また、元のコンテナで Docker のデフォルトのスワップ動作を使用していた場合、再接続時にmemorySwapを変更すると警告が表示されることがあります。 - Docker Desktop:macOS と Windows では、リソース上限が Docker Desktop 仮想マシン内で適用されるため、VM に割り当てられたリソースがコンテナへの割り当て上限になります。
再接続再接続への直接リンク
DockerSandbox はラベルの一致により既存コンテナへ再接続できます。start() の呼び出し時に、Sandbox ID と一致する mastra.sandbox.id ラベルを持つコンテナを検索します。見つかった場合は、次のように動作します。
- 実行中のコンテナはそのまま再利用されます。
- 停止中のコンテナは再起動されます。
// First run — creates a new container
const sandbox = new DockerSandbox({ id: 'persistent-sandbox' })
await sandbox._start()
// Later — reconnects to the existing container
const sandbox2 = new DockerSandbox({ id: 'persistent-sandbox' })
await sandbox2._start()
Docker 接続オプションDocker 接続オプションへの直接リンク
dockerOptions を介してリモート Docker ホストに接続するか、カスタムソケットパスを使用します。
// Remote Docker host
const sandbox = new DockerSandbox({
dockerOptions: {
host: '192.168.1.100',
port: 2376,
ca: fs.readFileSync('ca.pem'),
cert: fs.readFileSync('cert.pem'),
key: fs.readFileSync('key.pem'),
},
})
// Custom socket path
const sandbox = new DockerSandbox({
dockerOptions: {
socketPath: '/var/run/docker.sock',
},
})