除了root之外,你如何运行Openshift Docker容器?

J. *_*Doe 7 openshift docker

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

(13)Permission denied: AH00058: Error retrieving pid file /run/httpd/httpd.pid
Run Code Online (Sandbox Code Playgroud)

我正在部署的我的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"]
Run Code Online (Sandbox Code Playgroud)

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

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

小智 10

Openshift严格遵守自定义Docker构建的安全策略.

看看这个OpenShift应用程序平台

特别是在FAQ部分的第4点,这里引用.

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

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

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

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

不要以root身份运行

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

否则,您可以查看安全文档以获取有关如何放宽这些限制的说明.

我希望它有所帮助.


小智 8

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

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

RUN chgrp -R 0 /run && chmod -R g=u /run
Run Code Online (Sandbox Code Playgroud)

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