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

anj*_*wat 8 linux node.js npm docker reactjs

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"]
Run Code Online (Sandbox Code Playgroud)

这是我的泊坞窗文件。我正在尝试对示例反应应用程序进行 dockerize。我在组中添加了用户,然后使用该用户执行进一步的命令,您可以在该代码的第二行中看到这一点。我相信默认情况下,只有 root 用户有权写入这些文件,并且为了对这些文件进行更改,root 用户不应该是用户。因此我app在这里创建了用户。

但跑完之后docker build -t react-app.。我收到以下错误 -

在此输入图像描述

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

添加Run ls -laRun whoami- 在此输入图像描述

Aje*_*hah 8

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

正如 @DavidMaze 在评论中所建议的,以rootUSER app用户身份进行软件包安装并在最后但在运行时之前切换到它会很容易CMD ["npm", "start"]

但用户在使用命令运行应用程序时仍然app需要对目录的写入权限。因此,我们需要向用户提供对该目录的写权限。node_modules/.cachenpm startapp

这是一个执行上述所有操作的示例:

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"]
Run Code Online (Sandbox Code Playgroud)

另请注意,您正在使用开发模式运行 React 应用程序,在创建构建后,npm start您可能希望使用静态服务器来提供服务。