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

Docker中配置Puppeteer非root运行时出现mkdir权限报错EACCES如何解决

问题根因

Dockerfile操作顺序错误导致权限配置失效:
你在切换到pptruser运行用户前,提前对/app目录执行了所有者变更,但后续所有从构建阶段拷贝文件的COPY --from=builder操作,Docker默认会将拷贝的文件所有者设为root。最终/app/build目录的所有者为root,pptruser没有写入权限,无法运行时创建csv目录触发报错。

修复方案

可任选以下一种方案修复:

方案1:调整配置顺序(推荐)

将拷贝文件、权限修改的操作都放在切换运行用户之前,修改runner阶段的Dockerfile配置如下:

FROM node:alpine AS runner
WORKDIR /app

RUN apk add --no-cache \
      chromium \
      nss \
      freetype \
      harfbuzz \
      ca-certificates \
      ttf-freefont

ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

RUN npm install puppeteer@10.0.0

RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
    && mkdir -p /home/pptruser/Downloads

# 先完成所有文件拷贝
COPY --from=builder /app/package.json ./
COPY --from=builder /app/package-lock.json ./
COPY --from=builder /app/.env ./
COPY --from=builder /app/build ./build
COPY --from=builder /app/node_modules ./node_modules

# 统一修改目录所有者
RUN chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app

# 最后再切换运行用户
USER pptruser

EXPOSE 8081

CMD ["node", "build/src/index.js"]

方案2:拷贝时直接指定所有者

不调整原有操作顺序,给每个COPY指令添加--chown参数,指定文件所有者为pptruser:

COPY --chown=pptruser:pptruser --from=builder /app/package.json ./
COPY --chown=pptruser:pptruser --from=builder /app/package-lock.json ./
COPY --chown=pptruser:pptruser --from=builder /app/.env ./
COPY --chown=pptruser:pptruser --from=builder /app/build ./build
COPY --chown=pptruser:pptruser --from=builder /app/node_modules ./node_modules
可选优化

如果csv目录是业务固定需要的路径,也可以在构建阶段提前创建该目录,避免运行时动态创建的权限问题:
在builder阶段的RUN npm run build指令后增加一行:

RUN mkdir -p build/src/services/csv

内容的提问来源于stack exchange,提问作者MadTik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:48:02