我有一个容器,nodejs和pm2作为启动命令,在OpenShift上,我在启动时得到这个错误:
错误:EACCES:拒绝权限,mkdir '/.pm2'
我在一个马拉松主机上尝试了相同的图像,它工作得很好。
我是否需要更改用户ID?
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”,因此不以root身份运行映像。
我还尝试修复权限并将用户“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"]
Update 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"]
5条答案
按热度按时间ruoxqz4g1#
默认情况下,OpenShift将以非root用户身份运行容器。因此,如果应用程序需要以root身份运行,它可能会失败。您是否可以将容器配置为以root身份运行将取决于您在群集中拥有的权限。
最好将容器和应用程序设计为不必以root身份运行。
几点建议。
Dockerfile
的USER语句中,创建一个特殊的UNIX用户来运行应用程序,并设置该用户(使用其uid)。使用户的组成为根组。/src
目录及其下所有内容的权限,使其归特殊用户所有。确保一切都是组根。确保需要可写的任何内容对于组根都是可写的。Dockerfile
中将HOME
设置为/src
。这样做之后,当OpenShift将容器作为分配的uid运行时,其中group是root,那么由于所有内容都是组可写的,应用程序仍然可以更新
/src
下的文件。设置的HOME
变量确保代码写入主目录的任何内容都进入可写的/src
区域。qfe3c7zg2#
您还可以运行以下命令,赠款您登录的项目的root访问权限:
oc adm policy add-scc-to-user anyuid -z default
snz8szmq3#
Graham Dumpleton的解决方案是有效的,但不推荐。
Openshift在运行容器时将使用随机UID。
您可以在Pod生成的Yaml中看到这一点。
相反,您应该应用Docker安全最佳实践来编写Dockerfile。
1.不要将应用程序的执行绑定到特定的UID:使资源在需要时具有可读性(即0644而不是0640)和可执行性。
1.使可执行文件归root所有且不可写
有关建议的完整列表,请参阅:https://sysdig.com/blog/dockerfile-best-practices/
在您的情况下,不需要:
在最初的问题中,应用程序文件已由root所有。
下面的chmod足以使它们对世界可读和可执行。
ckx4rj1h4#
默认情况下,OpenShift Container Platform使用任意分配的用户ID运行容器。这提供了额外的安全性,防止进程由于容器引擎漏洞而逃离容器,从而在主机节点上实现升级的权限。
对于支持以任意用户身份运行的映像,映像中进程写入的目录和文件必须归根组所有,并且该组可读写。要执行的文件还必须具有组执行权限。
将以下内容添加到Dockerfile中,设置目录和文件权限,以允许root组中的用户在构建的镜像中访问它们:
由于容器用户始终是根组的成员,因此容器用户可以读取和写入这些文件。
https://docs.openshift.com/container-platform/4.11/openshift_images/create-images.html#use-uid_create-images
这在docker文件上看起来如何:
这样,您将作为opal用户运行,但WORKDIR /opal具有root作为组。
zbdgwd5y5#
你用的是哪种OpenShift?
您可以编辑“受限”安全上下文约束:
从openshift CLI:
并更改:
到
注意格雷厄姆·邓普顿的回答是恰当的