可以使用 Container 类中的 envVars 字段将环境变量传递到 Container 中,或者在 Container 启动时手动设置。
可以使用 Worker Secrets 或 Secret Store 将秘密传递到 Container 中,然后将它们作为环境变量传递到 Container 中。
可以使用 Workers KV 将 KV 值传递到 Container 中,然后读取这些值并将它们作为环境变量传递到 Container 中。
这些示例展示了传入秘密、KV 值和环境变量的各种方法。在每一个示例中,我们将传入:
- 作为硬编码环境变量的变量
"ENV_VAR" - 来自 Worker Secrets 的秘密
"WORKER_SECRET" - 来自 Secret Store 的秘密
"SECRET_STORE_SECRET" - 来自 Workers KV 的值
"KV_VALUE"
在实践中,您可能只使用其中一种存储秘密和数据的方法,但为了完整起见,我们将展示所有方法。
首先,让我们在 Worker Secrets 中创建 "WORKER_SECRET" 秘密:
npx wrangler secret put WORKER_SECRETyarn wrangler secret put WORKER_SECRETpnpm wrangler secret put WORKER_SECRET然后,让我们在 Secret Store 中创建一个名为 "demo" 的存储区,并将 "SECRET_STORE_SECRET" 秘密添加到其中:
npx wrangler secrets-store store create demo --remoteyarn wrangler secrets-store store create demo --remotepnpm wrangler secrets-store store create demo --remotenpx wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remoteyarn wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remotepnpm wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remote接下来,让我们创建一个名为 DEMO_KV 的 KV 命名空间并添加一个键值对:
npx wrangler kv namespace create DEMO_KVyarn wrangler kv namespace create DEMO_KVpnpm wrangler kv namespace create DEMO_KVnpx wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'yarn wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'pnpm wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'有关如何创建秘密的完整详细信息,请参阅 Workers Secrets documentation 和 Secret Store documentation。有关 KV 设置,请参阅 Workers KV documentation。
接下来,我们需要在 Wrangler 配置中添加绑定,以访问我们的秘密、KV 值和环境变量。
{
"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>"请注意,"WORKER_SECRET" 不需要 在 Wrangler 配置文件中指定,因为它会自动添加到 env 中。
另请注意,我们没有在 Wrangler 配置文件中_与容器相关的_部分为环境变量、秘密或 KV 值配置任何特定内容。
现在,让我们使用 Container 类中的 envVars 字段将环境变量和秘密传递给我们的容器:
// 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
};
}它的每个 Container 实例在启动时都将这些变量和秘密设置为环境变量。
但是,如果您想在每个实例的基础上设置环境变量怎么办?
在这种情况下,请使用 startAndWaitForPorts() 方法为每个实例传递环境变量。
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 ...
},
};KV 值对于不经常更改但需要您的容器访问的配置数据特别有用。由于 KV 操作是异步的,因此在启动容器时必须在运行时读取这些值。
以下是使用 KV 与容器的常见模式:
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");
}
},
};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");
}
},
};最后,您还可以通过 Wrangler 配置中的 image_vars 字段设置仅在构建容器映像时可用的构建时环境变量。