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
相关产品推荐
相关产品推荐

