跳转到内容
搜索文档

环境变量和秘密

将环境变量和秘密传递给您的容器

最后更新 查看 MarkdownAgent 设置

可以使用 Container 类中的 envVars 字段将环境变量传递到 Container 中,或者在 Container 启动时手动设置。

可以使用 Worker SecretsSecret Store 将秘密传递到 Container 中,然后将它们作为环境变量传递到 Container 中。

可以使用 Workers KV 将 KV 值传递到 Container 中,然后读取这些值并将它们作为环境变量传递到 Container 中。

这些示例展示了传入秘密、KV 值和环境变量的各种方法。在每一个示例中,我们将传入:

  • 作为硬编码环境变量的变量 "ENV_VAR"
  • 来自 Worker Secrets 的秘密 "WORKER_SECRET"
  • 来自 Secret Store 的秘密 "SECRET_STORE_SECRET"
  • 来自 Workers KV 的值 "KV_VALUE"

在实践中,您可能只使用其中一种存储秘密和数据的方法,但为了完整起见,我们将展示所有方法。

创建秘密和 KV 数据

首先,让我们在 Worker Secrets 中创建 "WORKER_SECRET" 秘密:

npx wrangler secret put WORKER_SECRET

然后,让我们在 Secret Store 中创建一个名为 "demo" 的存储区,并将 "SECRET_STORE_SECRET" 秘密添加到其中:

npx wrangler secrets-store store create demo --remote
npx wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remote

接下来,让我们创建一个名为 DEMO_KV 的 KV 命名空间并添加一个键值对:

npx wrangler kv namespace create DEMO_KV
npx wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'

有关如何创建秘密的完整详细信息,请参阅 Workers Secrets documentationSecret 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

现在,让我们使用 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 操作是异步的,因此在启动容器时必须在运行时读取这些值。

以下是使用 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 字段设置仅在构建容器映像时可用的构建时环境变量。

这篇文档对您有帮助吗?