← Containers / containers / examples
Proměnné prostředí a Secrets
Proměnné prostředí lze do Container předat pomocí envVars pole v Container třída, nebo ručním nastavením při spuštění Containeru.
Do kontejneru lze předat tajné údaje pomocí Worker Secrets nebo Secret Store, a poté je předat do Container jako proměnné prostředí.
Hodnoty KV lze do Containeru předat pomocí Workers KV, a následně načíst hodnoty a předat je do Container jako proměnné prostředí.
Tyto příklady ukazují různé způsoby předávání tajných hodnot, hodnot KV a proměnných prostředí. V každém z nich předáváme:
- proměnná
"ENV_VAR"jako pevně zakódovanou proměnnou prostředí - tajemství
"WORKER_SECRET"jako tajný klíč z Worker Secrets - tajemství
"SECRET_STORE_SECRET"jako tajný klíč ze Secret Store - hodnota
"KV_VALUE"jako hodnotu z Workers KV
V praxi obvykle postačí použít jen jednu z metod pro ukládání tajných klíčů a dat, ale pro úplnost si ukážeme všechny metody.
Vytváření tajných údajů a dat KV
Nejprve vytvoříme "WORKER_SECRET" tajný údaj v části Worker Secrets:
npx wrangler secret put WORKER_SECRETPoté v Secret Store vytvořte úložiště s názvem "demo" a přidejte do něj "SECRET_STORE_SECRET" tajný údaj k němu:
npx wrangler secrets-store store create demo --remotenpx wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remoteDále vytvoříme KV namespace s názvem DEMO_KV a přidejte pár klíč-hodnota:
npx wrangler kv namespace create DEMO_KVnpx wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'Podrobný postup vytváření secrets najdete v dokumentace Workers Secrets a Dokumentace Secret Store. Nastavení KV najdete v dokumentace Workers KV.
Přidání bindings
Dále musíme přidat vazby pro přístup k našim tajným hodnotám, hodnotám KV a proměnným prostředí v konfiguraci Wrangler.
{
"name": "my-container-worker",
"vars": {
"ENV_VAR": "my-env-var"
},
"secrets_store_secrets": [
{
"binding": "SECRET_STORE",
"store_id": "demo",
"secret_name": "SECRET_STORE_SECRET"
}
],
"kv_namespaces": [
{
"binding": "DEMO_KV",
"id": "<your-kv-namespace-id>"
}
]
// rest of the configuration...
}name = "my-container-worker"
[vars]
ENV_VAR = "my-env-var"
[[secrets_store_secrets]]
binding = "SECRET_STORE"
store_id = "demo"
secret_name = "SECRET_STORE_SECRET"
[[kv_namespaces]]
binding = "DEMO_KV"
id = "<your-kv-namespace-id>"Upozorňujeme, že "WORKER_SECRET" nemusí být zadán v konfiguračním souboru Wrangler, protože se automaticky přidává do env.
Také si všimněte, že jsme nekonfigurovali nic konkrétního pro proměnné prostředí, tajné údaje ani hodnoty KV v související s kontejnery částí konfiguračního souboru Wrangler.
Použití envVars na třídě Container
Nyní předáme proměnné prostředí a tajné hodnoty do našeho kontejneru pomocí envVars v Container třída:
// https://developers.cloudflare.com/workers/runtime-apis/bindings/#importing-env-as-a-global
import { env } from "cloudflare:workers";
export class MyContainer extends Container {
defaultPort = 8080;
sleepAfter = "10s";
envVars = {
WORKER_SECRET: env.WORKER_SECRET,
ENV_VAR: env.ENV_VAR,
// we can't set the secret store binding or KV values as defaults here, as getting their values is asynchronous
};
}Každá instance tohoto Container bude mít nyní tyto proměnné a tajné údaje
nastavené jako proměnné prostředí při spuštění.
Nastavení proměnných prostředí pro jednotlivé instance
Co ale když chcete nastavit proměnné prostředí pro každou instanci zvlášť?
V tomto případě použijte startAndWaitForPorts() metodu, kterou pro každou instanci předáte proměnné prostředí.
export class MyContainer extends Container {
defaultPort = 8080;
sleepAfter = "10s";
}
export default {
async fetch(request, env) {
if (new URL(request.url).pathname === "/launch-instances") {
let instanceOne = env.MY_CONTAINER.getByName("foo");
let instanceTwo = env.MY_CONTAINER.getByName("bar");
// Each instance gets a different set of environment variables
await instanceOne.startAndWaitForPorts({
startOptions: {
envVars: {
ENV_VAR: env.ENV_VAR + "foo",
WORKER_SECRET: env.WORKER_SECRET,
SECRET_STORE_SECRET: await env.SECRET_STORE.get(),
KV_VALUE: await env.DEMO_KV.get("KV_VALUE"),
},
},
});
await instanceTwo.startAndWaitForPorts({
startOptions: {
envVars: {
ENV_VAR: env.ENV_VAR + "bar",
WORKER_SECRET: env.WORKER_SECRET,
SECRET_STORE_SECRET: await env.SECRET_STORE.get(),
KV_VALUE: await env.DEMO_KV.get("KV_VALUE"),
// You can also read different KV keys for different instances
INSTANCE_CONFIG: await env.DEMO_KV.get("instance-bar-config"),
},
},
});
return new Response("Container instances launched");
}
// ... etc ...
},
};Čtení hodnot KV v kontejnerech
Hodnoty KV jsou užitečné zejména pro konfigurační data, která se mění jen zřídka, ale musí být dostupná vašim kontejnerům. Protože operace KV jsou asynchronní, musíte hodnoty načítat za běhu při spouštění kontejnerů.
Zde jsou běžné vzory používání KV s kontejnery:
Konfigurační data
export default {
async fetch(request, env) {
if (new URL(request.url).pathname === "/configure-container") {
// Read configuration from KV
const config = await env.DEMO_KV.get("container-config", "json");
const apiUrl = await env.DEMO_KV.get("api-endpoint");
let container = env.MY_CONTAINER.getByName("configured");
await container.startAndWaitForPorts({
startOptions: {
envVars: {
CONFIG_JSON: JSON.stringify(config),
API_ENDPOINT: apiUrl,
DEPLOYMENT_ENV: await env.DEMO_KV.get("deployment-env"),
},
},
});
return new Response("Container configured and launched");
}
},
};Feature flags
export default {
async fetch(request, env) {
if (new URL(request.url).pathname === "/launch-with-features") {
// Read feature flags from KV
const featureFlags = {
ENABLE_FEATURE_A: await env.DEMO_KV.get("feature-a-enabled"),
ENABLE_FEATURE_B: await env.DEMO_KV.get("feature-b-enabled"),
DEBUG_MODE: await env.DEMO_KV.get("debug-enabled"),
};
let container = env.MY_CONTAINER.getByName("features");
await container.startAndWaitForPorts({
startOptions: {
envVars: {
...featureFlags,
CONTAINER_VERSION: "1.2.3",
},
},
});
return new Response("Container launched with feature flags");
}
},
};Proměnné prostředí v době sestavení
Nakonec můžete nastavit i proměnné prostředí pro dobu sestavení, které jsou dostupné pouze při sestavování obrazu kontejneru, a to pomocí image_vars pole v konfiguraci Wrangler.