NodeJS Docker镜像构建失败:npm ERR! code EACCES权限问题
问题:Docker构建NodeJS镜像时遭遇EACCES权限错误,无法打开package-lock.json
我是Docker新手,首次尝试用Docker构建简单NodeJS应用镜像,构建因权限失败,报错npm ERR! code EACCES,具体为无法打开/app/package-lock.json,提示权限被拒绝。我使用node:16.14.0-alpine3.15作为基础镜像,按最佳实践创建了低权限用户app并切换至该用户执行后续操作,但教程中相同配置可正常运行,疑问是Alpine镜像更新导致,还是用户创建或其他步骤有误?
构建错误日志
=> [internal] load build context 2.0s => => transferring context: 821B 0.6s => [2/6] RUN addgroup app && adduser -S -G app app 9.7s => [3/6] WORKDIR /app 3.2s => [4/6] COPY package*.json . 2.6s => ERROR [5/6] RUN npm install 24.7s ------ > [5/6] RUN npm install: #10 23.08 npm notice #10 23.08 npm notice New minor version of npm available! 8.3.1 -> 8.17.0 #10 23.08 npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.17.0> #10 23.08 npm notice Run `npm install -g npm@8.17.0` to update! #10 23.08 npm notice #10 23.08 npm ERR! code EACCES #10 23.09 npm ERR! syscall open #10 23.09 npm ERR! path /app/package-lock.json #10 23.09 npm ERR! errno -13 #10 23.10 npm ERR! Error: EACCES: permission denied, open '/app/package-lock.json' #10 23.10 npm ERR! [Error: EACCES: permission denied, open '/app/package-lock.json'] { #10 23.10 npm ERR! errno: -13, #10 23.10 npm ERR! code: 'EACCES', #10 23.10 npm ERR! syscall: 'open', #10 23.10 npm ERR! path: '/app/package-lock.json' #10 23.10 npm ERR! } #10 23.10 npm ERR! #10 23.10 npm ERR! The operation was rejected by your operating system. #10 23.11 npm ERR! It is likely you do not have the permissions to access this file as the current user #10 23.11 npm ERR! #10 23.11 npm ERR! If you believe this might be a permissions issue, please double-check the #10 23.11 npm ERR! permissions of the file and its containing directories, or try running #10 23.11 npm ERR! the command again as root/Administrator. #10 23.11 #10 23.11 npm ERR! A complete log of this run can be found in: #10 23.12 npm ERR! /home/app/.npm/_logs/2022-08-14T09_27_48_642Z-debug-0.log ------ executor failed running [/bin/sh -c npm install]: exit code: 243
我的Dockerfile配置
FROM node:16.14.0-alpine3.15 RUN addgroup app && adduser -S -G app app USER app WORKDIR /app COPY package*.json . RUN npm install COPY . . ENV API=https://apilink.com/someuri EXPOSE 3000 CMD ["node","app.js"]
解决方案
问题根源
你的Dockerfile中切换用户的时机错误:
- 执行
USER app后再运行WORKDIR /app,此时/app目录由root用户创建,所有权属于root,app用户仅拥有读权限,无写入权限。 COPY package*.json .会将文件复制到/app,文件所有权同样属于root。- 执行
npm install时需要生成/修改package-lock.json,app用户因无写入权限触发EACCES错误。
修正方案(两种可选)
方案1:提前创建目录并转移所有权
先以root身份创建工作目录,将所有权转移给app用户后再切换用户:
FROM node:16.14.0-alpine3.15 # 先创建工作目录(root默认拥有) WORKDIR /app # 创建用户组和低权限用户 RUN addgroup app && adduser -S -G app app # 将工作目录所有权转移给app用户 RUN chown -R app:app /app # 切换到低权限用户 USER app # 复制package文件 COPY package*.json . # 执行依赖安装 RUN npm install # 复制应用代码 COPY . . ENV API=https://apilink.com/someuri EXPOSE 3000 CMD ["node","app.js"]
方案2:复制文件时指定所有者
在COPY命令中通过--chown=app:app参数直接将文件所有权赋予app用户:
FROM node:16.14.0-alpine3.15 RUN addgroup app && adduser -S -G app app WORKDIR /app # 复制package文件时指定所有者为app COPY --chown=app:app package*.json . # 切换到低权限用户 USER app RUN npm install # 复制应用代码时同样指定所有者 COPY --chown=app:app . . ENV API=https://apilink.com/someuri EXPOSE 3000 CMD ["node","app.js"]
关于教程可正常运行的说明
教程中的配置能正常运行,大概率是步骤顺序不同——比如先创建目录并授权,再切换用户;或是基础镜像的默认权限配置存在差异,但Alpine镜像中root创建的目录默认权限为755,普通用户无写入权限,因此你需要手动处理目录/文件的所有权问题。
内容的提问来源于stack exchange,提问作者Douo
相关产品推荐
相关产品推荐

