INTEGRITY Документация

Переменные окружения

Каждый exec() и createTerminal() запускает независимый процесс. Shell export в одном процессе не применяется к следующему запуску. Настройте окружение процесса через образ контейнера, setEnvVars, и относящиеся к отдельному запуску env.

Используйте переменные окружения для несекретный конфигурацию (пути, флаги функций, NODE_ENV, и аналогичные). Не помещайте в песочницу действующие API-ключи или другие долгоживущие учётные данные. Чтобы обращаться к внешним сервисам, которым нужны учётные данные, используйте обработчики исходящего трафика поэтому секреты остаются внутри Worker.

Как процесс получает окружение

Когда процесс запускается, среда выполнения формирует его окружение из:

  1. контейнер окружение (образ ENV и значения по умолчанию).
  2. Имена из setEnvVars, когда вы используете exec() (описано в следующем разделе).
  3. 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.