首页 文章

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

提问于
浏览
4

我有一个容器,其中nodejs和pm2作为启动命令,在OpenShift上我在启动时遇到此错误:

错误:EACCES:权限被拒绝,mkdir'/ . pm2'

我在马拉松主机上尝试过相同的图像,效果很好 .

我是否需要使用UserIds更改内容?

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"]

Update
节点映像已创建具有UID 1000的新用户"node",以便不以root身份运行映像 .
我还尝试修复权限并将用户"node"添加到root组 .
进一步我告诉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"]

Update2 感谢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"]

2 回答

  • 8

    默认情况下,OpenShift将以非root用户身份运行容器 . 因此,如果应用程序需要以root身份运行,则应用程序可能会失败 . 是否可以将容器配置为以root身份运行取决于您在群集中拥有的权限 .

    最好设计容器和应用程序,以便它不必以root身份运行 .

    一些建议 .

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

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

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

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

  • -2

    你使用什么样的openhift?

    您可以编辑“受限制的”安全上下文约束:

    来自openshift CLI:

    oc edit scc restricted
    

    并改变:

    runAsUser:
      type: RunAsUSer
    

    runAsUser:
      type: RunAsAny
    

    请注意Graham Dumpleton的答案是正确的

相关问题