You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:07:50