如何在Openshift中以非root身份运行Docker容器?

11

我目前正在运行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"]

我遇到过类似的问题多次,例如会显示“/supervisord.log文件被拒绝访问”或者类似的消息。

我该如何设置容器不以root用户身份运行所有命令?这似乎是导致我遇到所有问题的原因。

3个回答

14

Openshift在自定义Docker构建方面有非常严格的安全政策。

请看OpenShift应用平台

特别是在FAQ部分的第4点,引用如下。

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

原因是安全性!Origin默认使用以下安全策略:

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

许多Docker容器希望以root身份运行(因此可以编辑文件系统的所有内容)。图像作者指南提供了有关如何默认情况下使您的映像更安全的建议:

不要以root身份运行

如果要写入目录,请将其设置为群组可写并由群组ID 0拥有 如果它们需要绑定到<1024端口,则在可执行文件上设置net-bind功能

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

希望对您有所帮助。


谢谢,我一定会去了解的。感谢您提供的参考资料。 - J. Doe
1
您可以通过 oc adm add-scc-to-user anyuid -z default 放宽限制(为当前命名空间中的默认服务账户赋予使用“anyuid”SCC的能力)。 - Clayton
@Clayton 我收到了一个“来自服务器的错误(Forbidden):用户“xxx”无法在集群范围内获取安全上下文约束”的消息。 - asgs
更改安全上下文限制需要集群管理员权限,不能由项目管理员或普通用户执行。 - Graham Dumpleton

8
尽管您无法访问root,但默认情况下,您的OpenShift容器是root组的成员。您可以更改某些目录/文件权限以避免“Permission Denied”错误。如果您正在使用Dockerfile将镜像部署到OpenShift,则可以向Dockerfile添加以下RUN命令:
RUN chgrp -R 0 /run && chmod -R g=u /run

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


1
我希望我能为你的这个贡献给予+100分。谢谢。 - Darragh Enright

1

您可以使用任何用户或root身份运行Docker(不使用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分配的项目名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接