Docker容器内执行bunx命令失败问题排查
问题解决:Docker容器中使用bunx + Wrangler下载R2文件报
performance.markResourceTiming错误 问题背景
在Docker容器(oven/bun:debian)中执行以下命令下载Cloudflare R2文件时持续报错:
docker run --rm -ti --env CLOUDFLARE_API_TOKEN=xxx -v $(pwd)/storage:/home/bun/app/ oven/bun:debian bunx wrangler r2 object get bucket/backup/server-20241019192950.sql.gz -J eu
而在Docker外部直接执行wrangler r2 object get bucket/backup/server-20241019192950.sql.gz -J eu可正常运行,报错信息如下:
⛅️ wrangler 3.81.0 ------------------- Downloading "backup/server-20241019192950.sql.gz" from "sumiu-files (eu)". 13028 | ); 13029 | } 13030 | __name(finalizeAndReportTiming, "finalizeAndReportTiming"); 13031 | function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { 13032 | if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { 13033 | performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); ^ TypeError: performance.markResourceTiming is not a function. (In 'performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState)', 'performance.markResourceTiming' is undefined) at markResourceTiming (/tmp/bunx-0-wrangler@latest/node_modules/wrangler/wrangler-dist/cli.js:13033:21) at finalizeAndReportTiming (/tmp/bunx-0-wrangler@latest/node_modules/wrangler/wrangler-dist/cli.js:13022:7) at handleFetchDone (/tmp/bunx-0-wrangler@latest/node_modules/wrangler/wrangler-dist/cli.js:12965:68) at /tmp/bunx-0-wrangler@latest/node_modules/wrangler/wrangler-dist/cli.js:13309:44
原因分析
错误根源在于Bun环境与Node.js环境的API差异:
- Wrangler的代码会检测Node版本≥18.2时,调用Node.js独有的
performance.markResourceTimingAPI记录性能指标 - Bun的
performance对象并未实现这个Node专属API,用bunx运行wrangler时,代码在Bun环境中执行,触发未定义函数错误 - 外部环境是Node.js,天然支持该API,因此运行正常
解决方案
方案1:改用Node.js Docker镜像执行命令
直接使用Node.js官方镜像(版本≥18.2),用npx运行wrangler,完全匹配Wrangler的运行环境:
docker run --rm -ti --env CLOUDFLARE_API_TOKEN=xxx -v $(pwd)/storage:/home/node/app node:18-bookworm npx wrangler r2 object get bucket/backup/server-20241019192950.sql.gz -J eu
可根据需求选择更高版本的Node镜像(如node:20-bookworm),确保兼容性。
方案2:在Bun容器内安装Node.js后执行
如果必须使用Bun容器,可在容器内安装Node.js,然后用npx替代bunx运行wrangler:
docker run --rm -ti --env CLOUDFLARE_API_TOKEN=xxx -v $(pwd)/storage:/home/bun/app/ oven/bun:debian /bin/bash -c "apt update && apt install -y nodejs npm && npx wrangler r2 object get bucket/backup/server-20241019192950.sql.gz -J eu"
验证说明
两种方案都能规避Bun环境的API缺失问题,让Wrangler在兼容的Node.js环境中运行,从而正常完成R2文件下载操作。
内容的提问来源于stack exchange,提问作者Luiz E.
相关产品推荐
相关产品推荐

