Docker容器中使用Bun/Node写入文件时出现EBADF错误求助
Docker容器中写入文件报错EBADF的排查方案
我在Docker容器中部署了一个简单的Bun HTTP应用(使用常规Node.js API时也会出现完全相同的问题,因此这并非Bun专属问题),尝试写入文件系统时每次都会出现以下错误:
EBADF: Bad file descriptor fd: "-2" syscall: "write" errno: -9 error: uploading initial file failed, unable to write: /usr/src/app/temp/<name-of-file>.gp5, EBADF: Bad file descriptor
相关代码如下:
const uploadPath = process.cwd() + `${this.tempFolder}/${Date.now()}__${file.name}`; try { await Bun.write(uploadPath, await file.arrayBuffer()); } catch (error) { throw new Error( `uploading initial file failed, unable to write: ${uploadPath}, ${error}` ); }
process.cwd()和uploadPath指向的路径在Docker文件管理器中是正确的位置,求解决思路。
排查与解决方向
确保目标目录存在:代码直接写入路径但未提前创建
temp目录的话,会触发写入失败。可以在写入前递归创建目录:import { mkdir } from "fs/promises"; // 递归创建temp目录,不存在则生成 await mkdir(`${process.cwd()}/${this.tempFolder}`, { recursive: true });检查容器内目录权限:Docker容器中
/usr/src/app/temp目录可能没有写入权限。可以在Dockerfile中添加权限配置:# 创建temp目录并开放写入权限 RUN mkdir -p /usr/src/app/temp && chmod 777 /usr/src/app/temp # 更安全的方式:用非root用户运行容器并授权 RUN useradd -m appuser RUN chown -R appuser:appuser /usr/src/app/temp USER appuser替换process.cwd()为绝对路径:容器内的工作目录可能和预期不一致,直接使用绝对路径避免潜在问题:
const uploadPath = `/usr/src/app/${this.tempFolder}/${Date.now()}__${file.name}`;排查文件描述符是否被意外关闭:如果代码中之前对该路径有过文件操作,需检查是否存在提前关闭文件流、释放描述符的逻辑。
内容的提问来源于stack exchange,提问作者Ryan Roberts
相关产品推荐
相关产品推荐

