您只需在项目的目录中运行 npx wrangler dev(对于使用 Cloudflare Vite 插件的 Vite 项目则运行 vite dev),即可在本地运行容器和 Worker。
要在本地开发启用了容器的 Workers,您首先需要确保已安装兼容 Docker 的 CLI 工具和引擎。例如,您可以使用 Docker Desktop ↗ 或 Colima ↗。
当您启动开发会话时,您的容器镜像将被构建或下载。如果您的 Wrangler 配置 将 image 属性设置为本地路径,则将使用本地 Dockerfile 构建镜像。如果将 image 属性设置为镜像引用,则会从引用的注册表(例如 Cloudflare 注册表、Docker Hub、Amazon ECR 或 Google Artifact Registry)提取镜像。
当您的 Worker 代码调用以创建新容器时,容器实例将在本地启动。然后,请求将自动路由到正确的在本地运行的容器。
开发会话结束时,应停止所有关联的容器实例,但不会删除本地镜像,以便可以在后续构建中重用它们。
当您使用 Wrangler 或 Vite 进行开发时,每次保存更改时都会自动重新加载 Worker 的代码,但在容器中运行的代码则不会。
要使用新的代码更改重建容器,您可以按键盘上的 [r] 键,这会触发重建。然后将使用新构建的镜像重新启动容器实例。
您可能更喜欢设置自己的代码监视器和重载机制,或将本地目录挂载到本地容器镜像中以同步代码更改。这是可以做到的,但没有内置的机制,最佳实践将取决于您在容器代码中使用的语言和框架。
在生产环境中,您的 Worker 将可以访问容器的所有端口,因此您无需在 Dockerfile 中使用 EXPOSE 指令 ↗专门暴露端口。
但对于本地开发,您需要在 Dockerfile 中使用 EXPOSE 指令声明您需要访问的任何端口;例如:如果您要访问端口 4000,则使用 EXPOSE 4000。
如果您未暴露任何端口,则在本地开发中会看到以下错误:
The container "MyContainer" does not expose any ports. In your Dockerfile, please expose any ports you intend to connect to.如果您尝试连接到未在 Dockerfile 中暴露的任何端口,您将看到以下错误:
connect(): Connection refused: container port not found. Make sure you exposed the port in your container definition.当容器启动且尚无可用端口时,您也可能会看到此错误。您应重试,直到端口变得可用。 如果您使用的是 containers 包 ↗,则应为您处理此重试逻辑。
如果您在尝试连接容器时看到不透明的 internal error,则可能需要将 DOCKER_HOST 环境变量设置为容器引擎正在侦听的套接字路径。Wrangler 或 Vite 将尝试自动查找正确的套接字来用于与容器引擎通信,但如果不起作用,您可能必须将此环境变量设置为适当的套接字路径。
如果您正在运行 Cloudflare One 客户端或执行 TLS 检查的 VPN,则在 Docker 构建过程中发出的 HTTPS 请求可能会失败并出现 SSL 或证书错误。发生这种情况是因为 VPN 拦截了 HTTPS 流量并用其自己的证书颁发机构重新签名了该流量,而 Docker 默认情况下不信任该机构。
要解决此问题,您可以:
-
运行
wrangler dev或wrangler deploy时禁用 Cloudflare One 客户端或您的 VPN,之后再重新启用它。 -
将证书添加到您的 Docker 构建上下文中。Cloudflare One 客户端通过您主机上的
NODE_EXTRA_CA_CERTS和SSL_CERT_FILE环境变量公开其证书。您可以将证书作为环境变量传递到 Docker 构建中,以便在构建期间可用而无需被构建到最终镜像中。RUN if [ -n "$SSL_CERT_FILE" ]; then \ cp "$SSL_CERT_FILE" /usr/local/share/ca-certificates/Custom_CA.crt && \ update-ca-certificates; \ fi当您运行
wrangler dev或wrangler deploy时,Wrangler 会自动调用 Docker,因此,如果需要传递构建密钥,您需要使用wrangler containers push手动构建并推送镜像。