我试图为一个简单的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"]
2条答案
按热度按时间lbsnaicq1#
将
USER
行移动到Docker文件的末尾,靠近设置CMD
的位置。这里发生的事情是
WORKDIR
指令创建了/app
目录,由root所有。当你使用RUN npm install
时,它需要创建node_modules
目录。但是因为你已经降级到非root用户,它没有权限创建那个目录,所以你得到了这个错误。如果您最后指定
USER
,那么整个构建序列将以root身份运行,并且root将拥有您的应用程序和库文件。这些文件仍将对任何用户可读,但不可写。当您以USER app
身份运行容器时,它将被阻止覆盖您的应用程序代码,这是一个有用的安全步骤。umuewwlo2#
我将与公认的答案(它错误地解释了错误发生的原因)相反,并指出您实际上经常希望在执行任何其他操作(从创建WORKDIR开始)之前添加一个新用户/组。
解决办法有两个:
app:app
用户:组具有创建/app
工作目录的权限;但是,您复制的package*.json
文件归root
用户所有,并且app
用户在本例中尝试修改其中一个文件。如果您确实需要修改复制的文件,可以在copy命令期间分配所有权,如下所示:COPY --chown=app:app package*.json .
这将允许构建通过。但是:package-lock.json
中的某些内容,您实际上并不希望这种情况发生,而应该简单地用RUN npm ci
替换RUN npm install
。