权限被拒绝:缺少对/app的写入访问权限 - Docker错误

7
FROM node:14.16.0-alpine3.13
RUN addgroup app && adduser -S -G app app
USER app
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package*.json ./
RUN npm install
COPY . .
ENV APP_URL=http://api.myapp.com
EXPOSE 3000
CMD ["npm", "start"]

这是我的 Docker 文件。我正在尝试将一个示例 React 应用程序 docker 化。我添加了用户到组中,并在后续命令中使用该用户,您可以在此代码的第二行看到。我相信默认情况下,只有 root 用户才能访问这些文件并进行更改,为了对这些文件进行更改,不应该使用 root 用户。因此我在这里创建了 app 用户。
但是在运行 docker build -t react-app. 后,我遇到了以下错误 -

enter image description here

这里我做错了什么?有什么建议吗?
在添加Run ls -laRun whoami之后 - 输入图像描述

在您的Dockerfile中,可以在 COPY package*.json ./ 后添加 RUN ls -laRUN whoami,然后让我们知道输出结果是什么? - Gerard Setho
1
我可能会像@AjeetShah建议的那样,以root用户身份完成所有软件包的安装,并仅在非常非常后期切换到USER app,同时指定运行时的CMD。 这将允许安装程序运行,但防止应用程序修改自己的源代码或资产。 - David Maze
你能把这行代码改成 COPY package.json ./ 吗?因为 package-lock.json 可能会引起问题。 - Philippe
@AjeetShah即使我使用root用户,当我使用npm start启动我的应用程序时,permissions denied错误仍会被抛出,为此我找到了一个解决方案,我们不应该使用root用户。而且这也是不推荐的。 - anjali ahlawat
@AjeetShah 刚刚尝试了一下,但是没有成功。在运行 docker run react-app 时,它会给出权限被拒绝的错误。 - anjali ahlawat
显示剩余2条评论
2个回答

7
您看到此错误是因为 /app 目录属于 root 用户。您创建的用户 app 没有对此目录的写入权限。需要给用户 app 写入权限以安装节点包 (创建 node_modules 目录和 package-lock.json 文件)。
如 @DavidMaze 在评论中建议的,可以使用 root 用户进行软件包安装,并在最后但在运行时之前切换到 USER app
然而,在使用 npm start 命令运行应用程序时,app 用户仍需对 node_modules/.cache 目录拥有写入权限。因此,我们需要为用户 app 提供此目录的写入权限。
以下是一个执行上述所有操作的示例:
FROM node:14.16.0-alpine3.13
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package*.json ./
RUN npm install
COPY . .
ENV APP_URL=http://api.myapp.com
EXPOSE 3000

RUN addgroup app && adduser -S -G app app
RUN mkdir node_modules/.cache
RUN chown app:app node_modules/.cache

USER app
CMD ["npm", "start"]

另外需要注意的是,您正在使用 npm start 在 React 应用的开发模式下运行,成功构建后您可能需要使用静态服务器来提供服务。


你还应该保留一个 .dockerignore 文件,其中应添加 node_modules 和其他适当的文件或目录。 - Ajeet Shah
是的。我有一个 .dockerignore 文件,它保留了所有必要的文件。 - anjali ahlawat
你好 @AjeetShah我遇到了类似的问题,你能帮忙吗?以下是我的dockerfile的一部分,我使用它在bash中运行Cypress测试,但是在应用此修复后,我总是会收到错误No version of Cypress is installed in: /home/node/.cache/Cypress/8.7.0/Cypress USER node WORKDIR /app COPY package*.json ./ RUN npm install COPY ./cypress.json ./cypress.json COPY --chown=node:node . . CMD [ "bash" ] - Mona101ma
@Mona101ma 这是一个非常老的帖子。你能否通过提供一些最小化的代码来帮助我重现这个错误?但似乎你需要在你的docker中安装cypress - Ajeet Shah

0

当您创建用户名为“app”的用户时,在主目录“/home/app”中会创建一个新目录,因此工作目录应该是这样的:

    WORKDIR /home/app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接