exec() と createTerminal() は、それぞれ独立したプロセスを起動します。あるプロセスでシェルの export を実行しても、次の起動には反映されません。プロセスの環境は、コンテナイメージ、setEnvVars、起動ごとの env で設定します。
環境変数は シークレットではない 設定(パス、フィーチャーフラグ、NODE_ENV など)に使います。有効な API キーや長期間有効な認証情報をサンドボックスに入れないでください。認証情報が必要な外部サービスを呼ぶときは、送信トラフィックのハンドラー を使い、シークレットは Worker に残します。
プロセス起動時、ランタイムは次の順で環境を組み立てます。
- コンテナ の環境(イメージの
ENVとデフォルト)。 setEnvVarsで登録した名前(exec()を使う場合。次の節で説明します)。- その起動に渡した
envオプション(指定した場合)。
後の起動は、前の起動の上書きを引き継ぎません。あるプロセス内で export FOO=bar を実行しても、次の exec() には影響しません。
fetch ハンドラー内の Worker バインディングは、プロセスの環境変数ではありません。setEnvVars または起動時の env で渡した値だけがプロセス内に現れます(長期間有効なシークレットは渡さないでください)。
setEnvVars(envVars: Record<string, string | undefined>): Promise<void>| 値 | 効果 |
|---|---|
| string | 以降の exec() 起動にこの環境変数を設定します |
undefined |
以前に保存した変数を削除します |
各 exec() で、SDK は保存した名前を、そのプロセスの起動時環境にマージします。
保存した名前は、サンドボックスの Durable Object のメモリにあります。コンテナのファイルシステムには書き込まれず、バックアップにも含まれません。Durable Object が退避または置き換えられたあとに同じ名前が必要なら、もう一度 setEnvVars を呼ぶか、各 exec() で env を渡します。
const sandbox = getSandbox(env.Sandbox, "user-123");
await sandbox.setEnvVars({
NODE_ENV: "production",
APP_HOME: "/workspace/app",
LOG_LEVEL: "info",
});
const migrate = await sandbox.exec(["python", "migrate.py"], {
cwd: "/workspace/app",
});
await migrate.output({ encoding: "utf8" });
const seed = await sandbox.exec(["python", "seed.py"], {
cwd: "/workspace/app",
});
await seed.output({ encoding: "utf8" });
await sandbox.setEnvVars({
LOG_LEVEL: "debug",
TEMP_FLAG: undefined,
});const sandbox = getSandbox(env.Sandbox, "user-123");
await sandbox.setEnvVars({
NODE_ENV: "production",
APP_HOME: "/workspace/app",
LOG_LEVEL: "info",
});
const migrate = await sandbox.exec(["python", "migrate.py"], {
cwd: "/workspace/app",
});
await migrate.output({ encoding: "utf8" });
const seed = await sandbox.exec(["python", "seed.py"], {
cwd: "/workspace/app",
});
await seed.output({ encoding: "utf8" });
await sandbox.setEnvVars({
LOG_LEVEL: "debug",
TEMP_FLAG: undefined,
});const process = await sandbox.exec(["node", "app.js"], {
cwd: "/workspace/app",
env: {
NODE_ENV: "production",
PORT: "3000",
},
});const process = await sandbox.exec(["node", "app.js"], {
cwd: "/workspace/app",
env: {
NODE_ENV: "production",
PORT: "3000",
},
});| 動作 | 詳細 |
|---|---|
| スコープ | この起動だけ |
| マージ順 | コンテナ環境、次に setEnvVars、次にこの env |
| 副作用 | setEnvVars の保存内容は更新しません |
サンドボックス全体の名前とコンテナ環境だけで足りる場合は、env を省略します。
const terminal = await sandbox.createTerminal({
command: ["bash"],
cwd: "/workspace",
env: {
TERM: "xterm-256color",
APP_HOME: "/workspace/app",
},
});const terminal = await sandbox.createTerminal({
command: ["bash"],
cwd: "/workspace",
env: {
TERM: "xterm-256color",
APP_HOME: "/workspace/app",
},
});ターミナル起動時の env は、そのターミナルだけコンテナ環境に上書きします。ターミナルが必要とする名前は createTerminal に渡します。
対話シェル内の export は、そのターミナルの存続中だけ有効です。後続の exec() には適用されません。ターミナル を参照してください。
サンドボックス内のコードに、本番のプロバイダー認証情報を持たせないでください。シークレットは Worker に置き、outboundByHost(および enableInternet / allowedHosts などの関連ポリシー)で送信 HTTP(S) を傍受します。サンドボックスは通常のリクエスト、またはクライアントライブラリが求めるプレースホルダーを送れます。Worker が、リクエストがアカウントから出る前に本物の認証情報を付けます。
送信トラフィックを処理する を参照してください。認証情報の安全な注入も含みます。サンドボックスからホスト名で到達する Workers バインディング(KV、R2 など)は Workers バインディングに接続する を参照してください。