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

如何以非root用户正确运行React/Next.js/Yarn应用?

以非Root用户运行使用Yarn PnP的Next.js应用的正确方式

我发现大部分React/Next.js/Yarn的示例都是以root用户完成所有依赖安装操作,但业内普遍推荐以非root应用用户身份运行应用,核心原因是避免应用进程拥有自身代码的所有权(这点我理解)。

在Dockerfile中以root用户执行yarn install(使用PnP模式)时,所有依赖会被安装到root的主目录,同时.pnp.cjs和.pnp.loader.mjs文件中会硬编码这些依赖的路径。

我的项目package.json中的脚本如下:

"scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },

如果以root用户启动服务:

CMD ["yarn", "dev"]

服务可以正常运行。

但切换到非root用户app_user运行时:

USER app_user
CMD ["yarn","dev"]

程序会从.pnp.loader.mjs读取Next.js的路径,但会因尝试访问root用户的Yarn环境触发权限错误:

Error: Required package exists but could not be accessed (eACCES: permission denied, access '/root/.yarn/berry/cache/next-npm-14.2.5-ce63d89d89-10c0.zip/node_modules/next/').
# ...
Missing package: next@virtual:10d0ddd8962b160e8b7988b5b1cf9ce26b9a58b41ec7af94ce9595f61af7631df76c6dd2f22bd9f3088af482b8c60bcf3382616263c556f0e3ba392e203ea268#npm:14.2.5
Expected package location: /usr/local/app/.yarn/__virtual__/next-virtual-86a0c6e4d9/4/root/.yarn/berry/cache/next-npm-14.2.5-ce63d89d89-10c0.zip/node_modules/next/

查看/usr/local/app目录下.yarn的权限:

drwxr-xr-x    3 root     root          4096 Aug  5 19:29 .yarn

这个错误是合理的,毕竟我们的目标就是不让应用拥有代码所有权,自然不能让应用进程访问或修改root拥有的解压模块。

显然app_user需要访问相关目录,但如果修改权限,又会让app_user获得更新运行代码的权限。所以我尝试全程以app_user身份完成安装操作,确保权限正确,修改后的Dockerfile片段如下:

# ...
# 必须切换到该用户,否则Yarn PnP会使用root拥有的缓存路径,导致权限错误
ENV SERVICE_NAME=app_user
USER $SERVICE_NAME

RUN mkdir -p ~/bin
RUN corepack enable --install-directory ~/bin

COPY demo/.yarnrc.yml ./
... 其余内容省略

但这种方式会让代码归app_user所有,如果该用户被攻破,攻击者可以直接修改代码。虽然比以root运行更安全,但仍不够理想。

请问,以非root用户运行这类使用Yarn PnP的Next.js应用的正确方式是什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:03:25