权限被拒绝,mkdir在openshift

时间:2017-02-21 09:14:56

标签: node.js docker openshift pm2

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

  

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

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

我是否需要使用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"]

更新
节点映像已经创建了一个具有UID 1000的新用户“节点”,以便不以root身份运行映像 我还尝试修复权限并将用户“节点”添加到根组 进一步我告诉pm2它应该用哪个目录与ENV var:

  

PM2_HOME = /家庭/节点/应用程序/ .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 感谢格雷厄姆·杜普顿,我得到了它的工作

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

3 个答案:

答案 0 :(得分:8)

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

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

一些建议。

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

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

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

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

答案 1 :(得分:0)

您还可以运行以下命令,授予对您以以下身份登录的项目的根访问权限:

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

答案 2 :(得分:-2)

你使用什么样的开放式?

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

来自openshift CLI:

oc edit scc restricted 

并改变:

runAsUser:
  type: RunAsUSer

runAsUser:
  type: RunAsAny

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