【问题标题】:How do you run an Openshift Docker container as something besides root?除了 root 之外,您如何运行 Openshift Docker 容器?
【发布时间】:2016-10-09 22:55:53
【问题描述】:

我目前正在运行 Openshift,但是当我尝试构建/部署我的自定义 Docker 容器时遇到了问题。该容器在我的本地机器上正常工作,但是一旦它在 openshift 中构建并且我尝试部署它,我就会收到错误消息。我相信问题是因为我试图以 root 身份在容器内运行命令。

(13)Permission denied: AH00058: Error retrieving pid file /run/httpd/httpd.pid

我正在部署的 Docker 文件如下所示 -

FROM centos:7
MAINTAINER me<me@me>
RUN yum update -y
RUN yum install -y git https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y ansible && yum clean all -y
RUN git clone https://github.com/dockerFileBootstrap.git
RUN ansible-playbook "-e edit_url=andrewgarfield edit_alias=emmastone site_url=testing.com" dockerAnsible/dockerFileBootstrap.yml
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
COPY supervisord.conf /usr/etc/supervisord.conf
RUN rm -rf supervisord.conf
VOLUME [ "/sys/fs/cgroup" ]
EXPOSE 80 443
#CMD ["/usr/bin/supervisord"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

我多次遇到类似的问题,它会说Permission Denied on file /supervisord.log 或类似的东西。

如何设置它,使我的容器不会以 root 身份运行所有命令?它似乎导致了我遇到的所有问题。

【问题讨论】:

    标签: docker openshift


    【解决方案1】:

    Openshift 对自定义 Docker 构建有严格的安全政策。

    看看这个OpenShift Application Platform

    特别是在常见问题解答部分的第 4 点,此处引用。

    4.为什么我的 Docker 映像不能在 OpenShift 上运行?

    安全! Origin 默认使用以下安全策略运行:

    容器作为独立于其他系统用户的非 root 唯一用户运行 他们无法访问主机资源、运行特权或成为 root 它们被系统管理员定义的 CPU 和内存限制 他们访问的任何持久性存储都将使用唯一的 SELinux 标签,从而防止其他人看到他们的内容 这些设置是针对每个项目的,所以不同项目中的容器默认是看不到彼此的 普通用户可以运行 Docker、源代码和自定义构建 默认情况下,Docker 构建可以(并且经常)以 root 身份运行。您可以通过 builds/docker 和 builds/custom 策略资源控制谁可以创建 Docker 构建。 普通用户和项目管理员不能更改他们的安全配额。

    许多 Docker 容器希望以 root 身份运行(因此编辑文件系统的所有内容)。 Image Author's guide 提供了有关在默认情况下使您的图像更安全的建议:

    不要以root身份运行

    将您要写入的目录设为组可写并由组 id 0 拥有 如果需要绑定到端口 ,请在可执行文件上设置 net-bind 功能

    否则,您可以查看安全文档以了解如何放宽这些限制。

    希望对你有帮助。

    【讨论】:

    • 谢谢,我一定要调查一下。欣赏参考
    • 您可以使用oc adm add-scc-to-user anyuid -z default 放宽限制(赋予当前命名空间中的默认服务帐户使用“anyuid”SCC 的能力)。
    • @Clayton 我收到“来自服务器的错误(禁止):用户“xxx”无法在集群范围内获得 securitycontextconstraints”
    • 更改安全上下文约束需要集群管理员权限。它不能以项目管理员或普通用户的身份完成。
    【解决方案2】:

    尽管您无权访问 root,但默认情况下,您的 OpenShift 容器是 root 组的成员。您可以更改一些目录/文件权限以避免Permission Denied 错误。

    如果您使用 Dockerfile 将映像部署到 OpenShift,则可以将以下 RUN 命令添加到 Dockerfile:

    RUN chgrp -R 0 /run && chmod -R g=u /run
    

    这会将 /run 目录中所有内容的组更改为根组,然后将所有文件的组权限设置为等同于文件的所有者(组等于用户)。本质上,根组中的任何用户都与每个文件的所有者拥有相同的权限。

    【讨论】:

    • 我希望我能给你+100分。谢谢。
    【解决方案3】:

    您可以以任何用户身份运行 docker,也可以以 root 身份运行(而不是 Openshift 默认内置帐户 UID - 1000030000 在命令行 oc cli 工具上按顺序发出这两个命令时 oc login -u system:admin -n default 跟在 oc adm policy add-scc-to-user anyuid -z default -n projectname 之后,其中 projectname 是您在 docker 下分配的项目的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多