【问题标题】:Permission denied: Missing write access to /app - docker error权限被拒绝:缺少对 /app 的写访问权限 - docker 错误
【发布时间】:2021-07-02 22:13:34
【问题描述】:
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-app 进行 dockerize 处理。我在组中添加了用户,然后将该用户用于进一步的命令,如您在此代码的第二行中看到的那样。我相信默认情况下,只有 root 用户有权写入这些文件,并且为了对这些文件进行更改,root 用户不应该是用户。因此我在这里创建了app 用户。

但是在运行docker build -t react-app. 之后。我收到以下错误 -

我在这里做错了什么?有什么建议吗?

添加Run ls -laRun whoami后-

【问题讨论】:

  • 我没有工作。但是为什么会抛出这个错误呢?
  • 在你的Dockerfile中,你能不能在COPY package*.json ./之后添加RUN ls -laRUN whoami,让我们知道输出是什么?
  • 我可能会以 root 用户身份安装所有软件包,正如 @AjeetShah 所建议的那样,并且仅在您指定运行时 CMD 的最后一刻才切换到 USER app。这将使安装运行,但阻止应用程序修改自己的源或资产。
  • 你能改变这条线COPY package.json ./吗? package-lock.json 可能会导致问题。
  • @AjeetShah 即使我使用 root 用户,当我使用 npm start 启动我的应用程序时,permissions denied 再次抛出错误,我遇到了这个解决方案,我们不应该使用 root 用户。另外,也不推荐。

标签: node.js reactjs linux docker npm


【解决方案1】:

您看到此错误是因为 /app 目录属于 root 用户。您创建的用户app 对该目录没有写权限。用户app 需要写入权限才能安装节点包(创建 node_modules 目录和 package-lock.json 文件)。

正如@DavidMaze 在comments 中所建议的那样,以root 用户身份安装包并在最后但在运行时CMD ["npm", "start"] 之前切换到USER app 会很容易。

app 用户在使用npm start 命令运行应用程序时仍需要对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 应用程序,您可能希望在创建构建后使用 static server 来提供服务。

【讨论】:

  • 你还应该保留一个.dockerignore;应在其中添加node_modules 和其他适当的文件或目录。
  • 是的。我确实有一个 .dockerignore 文件来保存所有适当的文件。
  • 您好@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 复制 --chown=node:node 。 . CMD [“bash”]
  • @Mona101ma 这是很老的帖子了。你能通过提供一些最少的代码来帮助我重现这个错误吗?但您似乎需要在 docker 中安装 cypress
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 2021-04-12
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多