← Sandbox SDK / sandbox / 1-0-preview
Переменные окружения
Каждый exec() и createTerminal() запускает независимый процесс. Shell export в одном процессе не применяется к следующему запуску. Настройте окружение процесса через образ контейнера, setEnvVars, и относящиеся к отдельному запуску env.
Используйте переменные окружения для несекретный конфигурацию (пути, флаги функций, NODE_ENV, и аналогичные). Не помещайте в песочницу действующие API-ключи или другие долгоживущие учётные данные. Чтобы обращаться к внешним сервисам, которым нужны учётные данные, используйте обработчики исходящего трафика поэтому секреты остаются внутри Worker.
Как процесс получает окружение
Когда процесс запускается, среда выполнения формирует его окружение из:
- контейнер окружение (образ
ENVи значения по умолчанию). - Имена из
setEnvVars, когда вы используетеexec()(описано в следующем разделе). -
envпараметр при этом запуске, если вы его передадите.
Последующие запуски не сохраняют оверлеи от предыдущих запусков. Команда, которая выполняет export FOO=bar внутри одного процесса не изменяет следующий exec().
Привязки Workers в вашем fetch обработчика не являются переменными окружения процесса. Только значения, переданные через setEnvVars или запустите env появляются внутри процесса (и это не должны быть долгоживущие секреты).
setEnvVars()
setEnvVars(envVars: Record<string, string | undefined>): Promise<void>| Значение | Эффект |
|---|---|
| string | Задайте эту переменную окружения для последующего exec() запускает |
undefined |
Удаление ранее сохраненной переменной |
На каждом exec(), SDK объединяет сохраненные имена с окружением процесса при запуске.
Сохраненные имена хранятся в памяти Durable Object песочницы. Они не записываются в файловую систему контейнера и не входят в резервную копию. После вытеснения или замены Durable Object вызовите setEnvVars ещё раз, если эти имена всё ещё нужны, либо передайте env на каждый exec().
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,
});env на exec()
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 когда достаточно имён на уровне всей песочницы (и окружения контейнера).
env на createTerminal()
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 действует на протяжении всего времени существования этого terminal. Оно не распространяется на последующие exec() вызовов. См. Терминалы.
Внешние API и учётные данные
Код внутри песочницы не должен содержать действующие учётные данные провайдера. Храните секреты в Worker и перехватывайте исходящий трафик HTTP(S) с помощью outboundByHost (а также соответствующей политики, например enableInternet / allowedHosts). Песочница может отправлять обычные запросы или заглушки, которые требуют клиентские библиотеки, а Worker подставляет настоящие учётные данные перед тем, как запрос покинет вашу учётную запись.
См. Обработка исходящего трафика, включая безопасную передачу учётных данных. Информацию о привязках Workers (KV, R2 и подобных), к которым обращаются по имени хоста из песочницы, см. в Подключитесь к привязкам Workers.