简体   繁体   English

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

[英]NodeJS Docker container build failing - npm ERR! code EAccess

I'm trying to build a docker image for a simple nodeJS app but docker is not able to perform the operation completely and fails due to limited user privilages (at least I believe so).我正在尝试为简单的 nodeJS 应用程序构建 docker 图像,但 docker 无法完全执行操作并且由于用户权限有限而失败(至少我相信如此)。 But I'm getting the following error:但我收到以下错误:

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

I'm a beginner in docker and learning docker for the first time.我是 docker 的初学者,第一次学习 docker。 I used alpine as the base image and I believe the problem is on the user "app" being created (due to its limited privilege).我使用 alpine 作为基础映像,我相信问题出在正在创建的用户“应用程序”上(由于其权限有限)。 I saw that its recommended to limit the user which is set to execute the dockerized app.我看到它建议限制设置为执行 dockerized 应用程序的用户。 I wanted to do exactly that - to limit the user executing the docker application.我想这样做 - 限制执行 docker 应用程序的用户。 My question is: Is this an update from alpine itself?我的问题是:这是 alpine 本身的更新吗? (I saw on tutorials that this same dockerfile setup works but not for me... or Am I doing this the wrong way (when creating the user or at any other point)? (我在教程中看到同样的 dockerfile 设置有效,但不适用于我......或者我这样做是错误的方式(在创建用户时或在任何其他点)?

Here is my Dockerfile setup这是我的 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"]

Move the USER line to the end of the Dockerfile, near where you set the CMD .USER行移动到 Dockerfile 的末尾,靠近您设置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"]

What's happening here is that the WORKDIR directive creates the /app directory, owned by root.这里发生的是WORKDIR指令创建/app目录,由 root 拥有。 When you RUN npm install , it needs to create the node_modules directory. RUN npm install时,需要创建node_modules目录。 But since you've already stepped down to a non-root user, it doesn't have permission to create that directory and so you get that error.但是由于您已经降级为非 root 用户,因此它没有创建该目录的权限,因此您会收到该错误。

If you specify USER last, then the entire build sequence will be run as root, and root will own your application and library files.如果您最后指定USER ,那么整个构建序列将以 root 身份运行,并且 root 将拥有您的应用程序和库文件。 These files will still be readable by any user, but not writeable.这些文件仍然可以被任何用户读取,但不可写。 When you then run the container as USER app it's prevented from overwriting your application code, which is a useful security step.然后,当您将容器作为USER app运行时,它会被阻止覆盖您的应用程序代码,这是一个有用的安全步骤。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM