跳转到内容
本站为社区维护的非官方中文翻译,与 Cloudflare, Inc. 无关联。本站不提供账户登录,请勿在任何非官方站点输入您的 Cloudflare 账户信息。官方文档:developers.cloudflare.com

本地开发

最后更新 查看 MarkdownAgent 设置

你只需在项目的目录中运行 npx wrangler dev(对于使用 Cloudflare Vite 插件 的 Vite 项目则运行 vite dev),即可在本地运行容器和 Worker。

要在本地开发启用了 Container 的 Workers,你首先需要确保已安装兼容 Docker 的 CLI 工具和引擎。例如,你可以使用 Docker Desktop ↗ 或 Colima ↗。

使用 Durable Object 调度策略 的容器在本地开发时需要 Wrangler 4.136.0 或更高版本。要在本地运行 cloudflare/debian-trixie 托管镜像,请使用 Wrangler 4.141.0 或更高版本。

当你启动开发会话时,你的容器镜像将被构建或下载。如果你的 Wrangler 配置 将 image 属性设置为本地路径,则将使用本地 Dockerfile 构建镜像。如果将 image 属性设置为镜像引用,则会从引用的注册表(例如 Cloudflare Registry、Docker Hub、Amazon ECR 或 Google Artifact Registry)提取镜像。

当你的 Worker 代码调用以创建新容器时,容器实例将在本地启动。然后,请求将自动路由到正确的在本地运行的容器。

开发会话结束时,应停止所有关联的容器实例,但不会删除本地镜像,以便可以在后续构建中重用它们。

FUSE 支持

Miniflare 会自动向本地容器授予 Filesystem in Userspace (FUSE) 所需的 Docker 权限。这适用于 wrangler dev、Cloudflare Vite 插件以及直接使用 Miniflare。

当本地 Docker 守护进程在虚拟机 (VM) 内运行时,Miniflare 会授予这些权限。这包括 macOS 上的 Docker 引擎以及通过 Windows Subsystem for Linux (WSL) 运行的引擎。在 Linux 上,当 /dev/fuse 可用时,Miniflare 会为本地 rootless Docker 授予这些权限。

Linux 上的 rootful Docker 在本地开发期间默认不支持 FUSE。当 Docker 守护进程不满足这些条件或无法被检查时,Miniflare 不会授予 FUSE 权限。

迭代容器代码

当你使用 Wrangler 或 Vite 进行开发时,每次保存更改时都会自动重新加载 Worker 的代码,但在容器中运行的代码则不会。

要使用新的代码更改重建容器,你可以按键盘上的 [r] 键,这会触发重建。然后将使用新构建的镜像重新启动容器实例。

你可能更喜欢设置自己的代码监视器和重载机制,或将本地目录挂载到本地容器镜像中以同步代码更改。这是可以做到的,但没有内置的机制,最佳实践将取决于你在容器代码中使用的语言和框架。

部署后的差异

本地开发在 Docker 中运行你的容器。使用 Durable Object 调度策略 的已部署容器与本地容器在以下方面不同。本地可用的代码在部署后可能失败。

主机名长于 DNS 标签

容器的主机名是它用于自身的名称,hostname 命令会打印该名称。没有任何内容会将流量路由到它。在已部署的容器中,主机名是 64 个字符,比 DNS 标签允许的长度多一个。/etc/hosts 不会列出它,因此它无法解析。在本地,主机名是 12 个字符的 Docker 容器 ID,并且 /etc/hosts 会列出它。查找自身主机名的代码在部署后可能失败。

例如,python3 -m http.server 以及其他基于 Python http.server 模块构建的服务器(例如 wsgiref)会在启动时因以下错误退出:

UnicodeEncodeError: 'idna' codec can't encode characters in position 0-63: label too long

要用 Python 提供文件,请使用不会查找主机名的 socketserver:

python3 -c 'import http.server as h, socketserver as s; s.ThreadingTCPServer(("", 8000), h.SimpleHTTPRequestHandler).serve_forever()'

其他 Linux 用户仍保留 root 能力

在本地,Docker 不会向以非 root 用户运行的进程授予任何能力。文件权限适用于该进程。在已部署的容器中,无论用户是谁,每个进程都具有与 root 相同的 Linux 能力。更多信息请参阅 exec() 的 user 选项。

故障排除

端口

你的 Worker 可以连接到容器中的任何端口。

getTcpPort() 需要有进程在该端口上侦听。如果进程尚未启动,你会看到以下错误:

Container is not listening to port 8080

请重试,直到端口变得可用。

套接字配置 - internal error

如果你在尝试连接容器时看到不透明的 internal error,则可能需要将 DOCKER_HOST 环境变量设置为容器引擎正在侦听的套接字路径。Wrangler 或 Vite 将尝试自动查找正确的套接字来用于与容器引擎通信,但如果不起作用,你可能必须将此环境变量设置为适当的套接字路径。

Cloudflare One 客户端或 VPN 的 SSL 错误

如果你正在运行 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 手动构建并推送镜像。

这篇文档对您有帮助吗?