使用Deno下载保存PDF时遭遇PermissionDenied权限拒绝问题排查
问题分析与修复方案
嘿,我仔细看了你的代码、运行命令和Docker配置,这个PermissionDenied错误主要是Docker容器内的用户权限不足以及目录准备缺失导致的,下面是具体的原因和解决办法:
1. Deno用户没有pdfs目录的读写权限
你在Dockerfile里用了USER deno切换到Deno的专用用户,但这个用户默认对/app/pdfs目录没有读写权限:
- 当代码尝试创建
./pdfs/${uid}.pdf时,如果pdfs目录还没创建,Deno的Deno.open方法只会创建文件,不会自动生成上级目录; - 就算目录存在,
deno用户也可能没有该目录的写入权限,导致系统抛出权限拒绝错误。
修复步骤:
在Dockerfile中切换用户前先创建pdfs目录,并把目录权限设置给deno用户:
FROM hayd/alpine-deno:1.9.0 EXPOSE 1993 WORKDIR /app # 提前创建pdfs目录并赋予deno用户权限 RUN mkdir -p pdfs && chown -R deno:deno pdfs USER deno COPY deps.ts . RUN deno cache deps.ts COPY . . RUN deno cache main.ts # 修正CMD的数组格式(每个参数单独作为数组元素) CMD ["run", "--allow-net", "--allow-read", "--allow-write", "--allow-env", "--allow-run", "main.ts"]
2. 代码中未处理目录不存在的场景
即使在Docker里提前创建了目录,也可以在代码中增加目录检查逻辑,避免因为意外的目录缺失导致权限类错误(有时候系统会把“找不到目录”的错误包装成权限拒绝):
修改你的downloadPDF函数,先确保pdfs目录存在:
export default async function downloadPDF(uid: string): Promise<void> { // 递归创建pdfs目录,如果已存在则无操作 await Deno.mkdir('./pdfs', { recursive: true }); const res = await fetch(`${Deno.env.get('MY_PDF_URL')}/${uid}`); const file = await Deno.open(`./pdfs/${uid}.pdf`, { create: true, write: true }) if (res?.body) { for await(const chunk of res.body) { await Deno.writeAll(file, chunk); } } file.close(); }
3. Docker CMD的格式错误(次要但必须修正)
你的Dockerfile里的CMD写法有误,数组形式的CMD需要把每个命令参数拆分成单独的数组项,否则Deno无法正确识别权限参数。上面的Dockerfile已经修正了这个问题。
内容的提问来源于stack exchange,提问作者pgalle
相关产品推荐
相关产品推荐

