Next.js React应用Docker部署遇权限被拒问题求助
Next.js 部署权限错误解决方案
问题重现
部署Next.js应用至amd64架构Linux VPS时,触发如下权限拒绝错误:
[Error: EACCES: permission denied, scandir '/app/public/Fruitopia_illustrations'] { errno: -13, code: 'EACCES', syscall: 'scandir', path: '/app/public/Fruitopia_illustrations' }
添加COPY --chown=nextjs:nodejs --from=builder /app/public ./public指令后,问题仍未解决。
核心原因
你的Dockerfile中存在重复的COPY指令:
COPY --from=builder /app/public ./public COPY --chown=nextjs:nodejs --from=builder /app/public ./public
第一条指令会以root权限将文件复制到镜像,此时/app/public及子目录(包括Fruitopia_illustrations)的所有者为root。第二条指令虽然指定了--chown,但Docker仅会覆盖文件内容,不会修改已存在目录的权限,导致nextjs用户仍无读取目录的权限。
修复方案
方案1:移除无权限设置的重复COPY
直接删除第一条未带--chown的COPY指令,仅保留带权限配置的版本:
# 移除这一行:COPY --from=builder /app/public ./public COPY --chown=nextjs:nodejs --from=builder /app/public ./public
方案2:强制递归修改目录权限
如果方案1无效,可在复制文件后,手动递归修改/app/public目录的所有者:
COPY --from=builder /app/public ./public RUN chown -R nextjs:nodejs /app/public
方案3:在构建阶段提前修正权限
在builder阶段复制本地文件后,先调整public/Fruitopia_illustrations的权限,确保后续复制到runner阶段时权限正确:
# 在builder阶段的COPY . .之后添加: RUN chown -R node:node /app/public/Fruitopia_illustrations
额外验证点
- 检查本地开发环境中
public/Fruitopia_illustrations的权限,避免因本地权限问题导致镜像中权限继承异常 - 运行容器时,不要挂载宿主机目录覆盖
/app/public,否则会使用宿主机的权限配置
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

