升级到php:7.4-fpm-alpine3.14后Laravel Mix写入mix-manifest.json权限错误
问题根因
- Alpine 3.14 内置的Node.js/npm版本相比Alpine 3.13有安全策略升级,默认以root身份执行npm命令时,会自动降权到nobody用户运行,避免脚本提权风险
- 你的Dockerfile中COPY源码到容器后,仅给bootstrap、storage目录设置了777权限,public目录的所有者仍然是root,nobody用户没有写入权限,因此生成mix-manifest.json时报错
- 同时/root/.npm目录属于root用户,nobody用户也没有扫描权限,所以日志里也会出现对应目录的访问错误
可行解决方案
直接修改你的Dockerfile,调整COPY源码后的权限配置和npm命令执行逻辑即可,核心修改点如下:
- 复制源码后,先递归重置整个项目目录的所有者为www-data
- 切换到www-data用户执行npm相关操作,避免npm自动降权到nobody,同时保证生成的静态文件权限符合运行要求
以下是修改后的关键Dockerfile代码段:
# Add source code from local to container WORKDIR /var/www/app COPY ${SRC_DIR} . # 新增:重置整个项目目录的所有者为www-data RUN chown -R www-data:www-data /var/www/app # Grant permission for folders & install packages RUN chmod 777 -R bootstrap storage && \ cp ./env/.env.${APP_ENV} .env && \ composer install RUN rm -rf .env # 修改:切换到www-data用户执行npm命令 RUN su -s /bin/sh www-data -c "npm install && npm run ${APP_ENV} && rm -rf node_modules"
如果上述方案执行仍有异常,可以在npm命令后追加--unsafe-perm参数,强制允许当前用户操作文件:
RUN su -s /bin/sh www-data -c "npm install --unsafe-perm && npm run ${APP_ENV} --unsafe-perm && rm -rf node_modules"
内容的提问来源于stack exchange,提问作者Tiến Vũ
相关产品推荐
相关产品推荐

