【问题标题】:NodeJS Docker container build failing - npm ERR! code EAccessNodeJS Docker 容器构建失败 - npm ERR!代码 EAccess
【发布时间】:2023-02-08 09:03:10
【问题描述】:

我正在尝试为一个简单的 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 作为基础图像,我相信问题出在正在创建的用户“应用程序”上(由于其权限有限)。我看到它建议限制设置为执行 dockerized 应用程序的用户。我正是想这样做——限制用户执行 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"]

【问题讨论】:

  • 你真的需要npm install而不是npm ci吗?

标签: node.js linux docker npm alpine-linux


【解决方案1】:

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"]

这里发生的是 WORKDIR 指令创建了 /app 目录,归 root 所有。当你RUN npm install时,它需要创建node_modules目录。但是由于您已经降级为非根用户,因此它没有创建该目录的权限,因此您会收到该错误。

如果您最后指定USER,那么整个构建序列将以 root 身份运行,并且 root 将拥有您的应用程序和库文件。这些文件仍然可以被任何用户读取,但不可写。当您随后以USER app 运行容器时,它不会覆盖您的应用程序代码,这是一个有用的安全步骤。

【讨论】:

  • 您的答案有效,但仍然存在局限性。例如,正在创建的系统用户仍然没有创建文件夹的必要权限。我试图通过在 /app 目录中创建一个名为 data 的文件夹来将数据保存在我的 docker 中(使用卷),但它告诉我我不能这样做,因为用户权限是有限的。有什么办法可以解决这个问题吗?我运行的命令是:docker volume create app-data, docker run -v app-data:/app/data/ <docer_image_name>
  • 这个问题似乎与使用非 root 用户有关;无论所有权设置如何,Docker 守护进程仍将能够设置文件系统。如果您可以安排将数据存储在数据库而不是容器文件系统中,那通常是更好的方法并且更易于管理。
【解决方案2】:

我将反对已接受的答案(它错误地解释了错误发生的原因)并说您通常实际上想在执行任何其他操作(从创建 WORKDIR 开始)之前添加一个新的用户/组。

修复有两个方面:

  • app:app user:group 确实拥有创建/app workdir 的权限;但是,您复制的 package*.json 文件归 root 用户所有,在这种情况下,app 用户正试图修改其中一个文件。如果您确实需要修改复制的文件,您可以在复制命令期间分配所有权,如下所示:COPY --chown=app:app package*.json . 这将允许构建通过。然而:

  • 我认为在这种特定情况下,当 npm 试图覆盖 package-lock.json 中的某些内容时,您实际上不希望发生这种情况,应该简单地将 RUN npm install 替换为 RUN npm ci。这也将允许构建通过。

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 2015-05-22
    • 2022-06-23
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多