Docker环境下npm start报PM2权限错误,直接运行PM2命令正常如何解决
问题原因
- npm默认安全限制:当以root身份执行
npm run相关脚本时,npm会自动将执行权限降级到nobody用户。nobody用户没有访问/root目录下.pm2配置文件夹的权限,因此触发EACCES: permission denied报错。而直接在终端执行pm2命令时没有经过npm的权限降级流程,以root身份运行可以正常读写/root下的配置文件,因此运行正常。 - Dockerfile语法错误:你安装pm2的命令
npm install pm2:2.9.2 -g中版本指定语法错误,正确的版本指定符为@而非:,错误的语法会导致安装的pm2版本不符合预期,也可能引发兼容类报错。
解决方案
方案1:关闭npm权限降级限制
在Dockerfile中添加npm配置,允许root身份执行npm脚本时不降级权限,改动最小适合快速验证修复:
RUN npm install pm2@2.9.2 -g && pm2 update && npm config set unsafe-perm true
方案2:修改PM2配置目录路径
将PM2的配置目录指定到/app目录下,避免访问root用户的私有目录:
- 在Dockerfile中提前创建PM2目录并开放权限:
RUN npm install pm2@2.9.2 -g && pm2 update \ && mkdir -p /app/.pm2 && chmod 777 /app/.pm2
- 修改package.json的scripts配置,指定PM2_HOME路径:
"start": "PM2_HOME=/app/.pm2 pm2 start ecosystem.config.js"
方案3:使用普通用户运行容器(推荐)
从根源避免root用户相关的权限混淆问题,符合容器安全最佳实践,修改Dockerfile如下:
FROM node:alpine WORKDIR /app RUN npm install pm2@2.9.2 -g && pm2 update \ # 创建普通用户组和用户 && addgroup -S appgroup && adduser -S appuser -G appgroup \ # 给/app目录授权 && chown -R appuser:appgroup /app # 切换到普通用户执行后续操作 USER appuser EXPOSE 8888
内容的提问来源于stack exchange,提问作者Vladyslav Chalyi
相关产品推荐
相关产品推荐

