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

hfsqlsce  于 2023-05-28  发布在  Docker
关注(0)|答案(5)|浏览(216)

我有一个容器,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"]
ruoxqz4g

ruoxqz4g1#

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

  • Dockerfile的USER语句中,创建一个特殊的UNIX用户来运行应用程序,并设置该用户(使用其uid)。使用户的组成为根组。
  • 修复/src目录及其下所有内容的权限,使其归特殊用户所有。确保一切都是组根。确保需要可写的任何内容对于组根都是可写的。
  • 确保在Dockerfile中将HOME设置为/src

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

qfe3c7zg

qfe3c7zg2#

您还可以运行以下命令,赠款您登录的项目的root访问权限:
oc adm policy add-scc-to-user anyuid -z default

snz8szmq

snz8szmq3#

Graham Dumpleton的解决方案是有效的,但不推荐。
Openshift在运行容器时将使用随机UID。
您可以在Pod生成的Yaml中看到这一点。

spec:
    - resources:
      securityContext:
        runAsUser: 1005120000

相反,您应该应用Docker安全最佳实践来编写Dockerfile。
1.不要将应用程序的执行绑定到特定的UID:使资源在需要时具有可读性(即0644而不是0640)和可执行性。
1.使可执行文件归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
ckx4rj1h

ckx4rj1h4#

默认情况下,OpenShift Container Platform使用任意分配的用户ID运行容器。这提供了额外的安全性,防止进程由于容器引擎漏洞而逃离容器,从而在主机节点上实现升级的权限。

对于支持以任意用户身份运行的映像,映像中进程写入的目录和文件必须归根组所有,并且该组可读写。要执行的文件还必须具有组执行权限。

将以下内容添加到Dockerfile中,设置目录和文件权限,以允许root组中的用户在构建的镜像中访问它们:

RUN chgrp -R 0 /some/directory && \
    chmod -R g=u /some/directory

WORKDIR /some/directory

由于容器用户始终是根组的成员,因此容器用户可以读取和写入这些文件。
https://docs.openshift.com/container-platform/4.11/openshift_images/create-images.html#use-uid_create-images
这在docker文件上看起来如何:

# Add non-root user (with home dir at /opal)

RUN useradd -m -b / -s /bin/bash opal

RUN chgrp -R 0 /opal && \
    chmod -R g=u /opal

WORKDIR /opal

这样,您将作为opal用户运行,但WORKDIR /opal具有root作为组。

zbdgwd5y

zbdgwd5y5#

你用的是哪种OpenShift?
您可以编辑“受限”安全上下文约束:
从openshift CLI:

oc edit scc restricted

并更改:

runAsUser:
  type: RunAsUSer

runAsUser:
  type: RunAsAny

注意格雷厄姆·邓普顿的回答是恰当的

相关问题