权限被拒绝,mkdir 在 openshift 的容器中

permission denied, mkdir in container on openshift

我有一个包含 nodejs 和 pm2 作为启动命令的容器,在 OpenShift 上我在启动时收到此错误:

Error: EACCES: permission denied, mkdir '/.pm2'

我在 Marathon 主机上尝试了相同的图像,效果很好。

我需要更改 UserId 的内容吗?

Dockerfile:

FROM node:7.4-alpine

RUN npm install --global yarn pm2

RUN mkdir /src

COPY . /src

WORKDIR /src

RUN yarn install --production

EXPOSE 8100

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]

更新
节点映像已经创建了一个 UID 为 1000 的新用户 "node" 而不是 运行 根映像。
我还尝试修复权限并将用户 "node" 添加到根组。
此外,我告诉 pm2 它应该与 ENV var 一起使用哪个目录:

PM2_HOME=/home/node/app/.pm2

但我仍然得到错误:

Error: EACCES: permission denied, mkdir '/home/node/app/.pm2'

更新的 Dockerfile:

FROM node:7.4-alpine

RUN npm install --global yarn pm2

RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app
RUN chmod -R 755 /home/node/app
RUN chown -R node:node /home/node/app

RUN yarn install --production

EXPOSE 8100

USER 1000

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]

更新2 感谢 Graham Dumpleton 我让它工作了

FROM node:7.4-alpine

RUN npm install --global yarn pm2

RUN adduser node root
COPY . /home/node/app
WORKDIR /home/node/app

RUN yarn install --production

RUN chmod -R 775 /home/node/app
RUN chown -R node:root /home/node/app

EXPOSE 8100

USER 1000

CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]

OpenShift 默认将 运行 容器作为非 root 用户。因此,如果您的应用程序需要 运行s 作为根用户,它可能会失败。是否可以将容器配置为 运行 作为 root 将取决于您在集群中拥有的权限。

最好设计您的容器和应用程序,这样它就不必 运行 作为 root。

几点建议。

  • 为应用程序创建一个特殊的 UNIX 用户 运行 并在 Dockerfile 的 USER 语句中设置该用户(使用其 uid)。将用户组设为根组。

  • 修复特殊用户拥有的 /src 目录及其下所有内容的权限。确保一切都是组根。确保任何需要可写的内容都可写到组 root。

  • 确保在 Dockerfile 中将 HOME 设置为 /src

完成后,当 OpenShift 运行 将您的容器作为分配的 uid,其中组为 root,然后由于一切都是组可写的,应用程序仍然可以更新 /src 下的文件。设置的 HOME 变量确保通过代码写入主目录的任何内容都进入可写 /src 区域。

您使用的是哪种 openshift?

您可以编辑 "restricted" 安全上下文约束:

来自 openshift CLI:

oc edit scc restricted 

并更改:

runAsUser:
  type: RunAsUSer

runAsUser:
  type: RunAsAny

请注意,Graham Dumpleton 的回答是正确的

您还可以 运行 下面的命令授予对您登录的项目的 root 访问权限:

oc adm policy add-scc-to-user anyuid -z default

Graham Dumpleton 的解决方案有效但不推荐。

Openshift,将在 运行 个容器时使用随机 UID。

您可以在 Pod 生成的 Yaml 中看到。

spec:
    - resources:
      securityContext:
        runAsUser: 1005120000

您应该应用 Docker 安全最佳实践来编写您的 Docker 文件。

  1. 不要将您的应用程序的执行绑定到特定的 UID:使资源世界可读(即 0644 而不是 0640)并在需要时可执行。

  2. 使可执行文件归 root 所有且不可写

有关推荐的完整列表,请参阅:https://sysdig.com/blog/dockerfile-best-practices/

在你的情况下,没有必要:

RUN adduser node root
...
RUN chown -R node:node /home/node/app
USER 1000

在原问题中,应用程序文件已归 root 所有。
以下 chmod 足以使它们对世界可读和可执行。

RUN chmod -R 775 /home/node/app