NodeJS Docker容器构建失败- npm错误!代码EAccess

f2uvfpb9  于 2023-02-08  发布在  Docker
关注(0)|答案(2)|浏览(147)

我试图为一个简单的nodeJS应用程序构建一个docker映像,但docker无法完全执行操作,并且由于用户权限有限而失败(至少我相信是这样)。

=> [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

我是Docker的初学者,也是第一次学习Docker。我使用alpine作为基础映像,我认为问题出在用户“应用程序”上(由于其权限有限)。我看到建议限制设置为执行Docker化应用程序的用户。我想做的正是这样-限制执行Docker应用程序的用户。我的问题是:这是alpine本身的更新吗?(我在教程中看到这个相同的dockerfile设置可以工作,但不适合我...或者我做错了(当创建用户或在任何其他点)?
下面是我的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"]
lbsnaicq

lbsnaicq1#

USER行移动到Docker文件的末尾,靠近设置CMD的位置。

FROM node:16-alpine
...
# still as default USER root
COPY package*.json .
RUN npm install # or npm ci
...
# only at the end of the file
USER app
EXPOSE 3000
CMD ["node", "app.js"]

这里发生的事情是WORKDIR指令创建了/app目录,由root所有。当你使用RUN npm install时,它需要创建node_modules目录。但是因为你已经降级到非root用户,它没有权限创建那个目录,所以你得到了这个错误。
如果您最后指定USER,那么整个构建序列将以root身份运行,并且root将拥有您的应用程序和库文件。这些文件仍将对任何用户可读,但不可写。当您以USER app身份运行容器时,它将被阻止覆盖您的应用程序代码,这是一个有用的安全步骤。

umuewwlo

umuewwlo2#

我将与公认的答案(它错误地解释了错误发生的原因)相反,并指出您实际上经常希望在执行任何其他操作(从创建WORKDIR开始)之前添加一个新用户/组。
解决办法有两个:

  • app:app用户:组具有创建/app工作目录的权限;但是,您复制的package*.json文件归root用户所有,并且app用户在本例中尝试修改其中一个文件。如果您确实需要修改复制的文件,可以在copy命令期间分配所有权,如下所示:COPY --chown=app:app package*.json .这将允许构建通过。但是:
  • 我认为,在这个特定的情况下,npm试图覆盖package-lock.json中的某些内容,您实际上并不希望这种情况发生,而应该简单地用RUN npm ci替换RUN npm install

相关问题