0

我有一个简单的 Centos6 docker 镜像:

FROM centos:6
MAINTAINER Simon 1905 <simbo@x.com>
RUN yum -y update && yum -y install httpd && yum clean all
RUN sed -i "s/Listen 80/Listen 8080/" /etc/httpd/conf/httpd.conf && \
  chown apache:apache /var/log/httpd && \
  chmod ug+w,a+rx /var/log/httpd && \
  chown apache:apache /var/run/httpd
RUN mkdir -p /var/www/html && echo "hello world!" >> /var/www/html/index.html
EXPOSE 8080
USER apache
CMD /usr/sbin/httpd -D FOREGROUND

我可以在本地运行它并将其推送到 hub.docker.com。如果我随后进入在本地运行的 Redhat OpenShift Container Developer Kit (CDK) 的 Web 控制台并从 dockerhub 部署映像,它工作正常。如果我进入 OpenShift3 Pro Web 控制台,则 pod 会进入崩溃循环。控制台或命令行上没有用于诊断问题的日志。非常感谢任何帮助。

为了尝试查看这是否只是 Centos7 的问题,我将第一行更改为centos:7,它再次适用于 minishift CDK,但不适用于 OpenShift3 Pro。它确实在 pod 的日志选项卡上显示了一些内容:

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.128.2.55. Set the 'ServerName' directive globally to suppress this message
(13)Permission denied: AH00058: Error retrieving pid file /run/httpd/httpd.pid
AH00059: Remove it before continuing if it is corrupted.
4

2 回答 2

2

它失败了,因为您的图像希望以特定用户身份运行。

在 Minishift 中,这是允许的,因为能够以 root 身份运行图像。

在 OpenShift Online 上,您的图像将作为任意分配的 UID 运行,并且永远不能作为选定的 UID 运行,也永远不能作为 root 运行。

如果您只是追求一种托管静态文件的方式,请参阅:

这是一个 S2I 构建器,用于获取 Apache 的静态文件并在容器中运行它们。

您可以通过运行以下命令将其用作 S2I 构建器:

oc new-app centos/httpd-24-centos7~<repository-url> --name httpd
oc expose svc/httpd

或者,如果您想尝试自定义它,您可以创建一个派生图像。

无论哪种方式,如果想构建自己的,看看它是如何实现的。

于 2017-07-24T21:08:32.487 回答
0

来自https://docs.openshift.com/container-platform/3.5/creating_images/guidelines.html#openshift-container-platform-specific-guidelines的 redhat 企业文档:

默认情况下,OpenShift Container Platform 使用任意分配的用户 ID 运行容器。这为由于容器引擎漏洞而逃离容器的进程提供了额外的安全性,从而在主机节点上实现了升级的权限。对于支持以任意用户身份运行的映像,映像中的进程可能写入的目录和文件应归根组所有,并且可由该组读取/写入。要执行的文件也应该具有组执行权限。

RUN chgrp -R 0 /some/directory \
  && chmod -R g+rwX /some/directory

所以在这种情况下,在 OpenShift 3 Online Pro 上运行的修改后的 Docker 文件是:

FROM centos:6
MAINTAINER Simon 1905 <simbo@x.com>
RUN yum -y install httpd && yum clean all
RUN sed -i "s/Listen 80/Listen 8080/" /etc/httpd/conf/httpd.conf && \
  chown apache:0 /etc/httpd/conf/httpd.conf && \
  chmod g+r /etc/httpd/conf/httpd.conf && \
  chown apache:0 /var/log/httpd && \
  chmod g+rwX /var/log/httpd && \
  chown apache:0 /var/run/httpd && \
  chmod g+rwX /var/run/httpd
RUN mkdir -p /var/www/html && echo "hello world!" >> /var/www/html/index.html && \
  chown -R apache:0 /var/www/html && \
  chmod -R g+rwX /var/www/html
EXPOSE 8080
USER apache
CMD /usr/sbin/httpd -D FOREGROUND
于 2017-07-26T19:21:07.503 回答