如何以非root用户身份在Docker容器中启动crond?

时间:2018-11-01 14:45:49

标签: docker cron centos

我正在使用下面的Dockerfileentrypoint.sh。我需要以非root用户身份启动容器中的crond服务,但得到Permission denied。如何以非root用户身份启动crond服务?

我需要在USER中加入Dockerfile,因为这是我的Openshift 3平台中的强制管理设置。

Dockerfile

FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/*
RUN cd / && mkdir /code
ADD entrypoint.sh /code/
RUN chmod -R 755 /code/entrypoint.sh
ENTRYPOINT ["/code/entrypoint.sh"]
RUN useradd -l -u 1001510000 -c "1001510000" 1001510000
USER 1001510000
CMD ["top"]

entrypoint.sh

#!/bin/bash
echo "in the entrypoint!"
echo "executing id"
id
echo "executing crond start"
crond start
echo "executing $@"
$@

错误输出

in the entrypoint!
executing id
uid=1001510000(1001510000) gid=1000(1001510000) groups=1000(1001510000)
executing crond start
crond: can't open or create /var/run/crond.pid: Permission denied
executing top

2 个答案:

答案 0 :(得分:1)

如何根据OpenShift Container Platform-Specific Guidelines 重新构建?例如相关的uid和gid。

答案 1 :(得分:0)

首先crond必须代表其他用户调用命令。在没有root的情况下怎么办?即使您将以某种方式与该用户一起运行此恶魔进程,也很有可能会缺少其他权限才能运行某些命令。

但是我想您可以尝试,也许这会有所帮助:

您的用户根本没有错误日志所述的权限。如果您要尝试以非root用户身份运行,请创建crond-users,然后将/var/run/crond.pid组从root更改为crond-users。最后但并非最不重要的一点是,将您的用户添加到crond-users组。 像这样:

RUN groupadd crond-users && \
    chgrp crond-users /var/run/crond.pid && \
    usermod -a -G crond-users 1001510000

命中1

此外,泊坞窗默认入口点为/bin/bash -c,但没有默认命令。因此,您的Dockerfile可能如下所示:

FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/* && \
    cd / && mkdir /code && \
    chmod -R 755 /code/entrypoint.sh && \
    useradd -l -u 1001510000 -c "1001510000" 1001510000 && \
    addgroup crond-users && \
    chgrp crond-users /var/run/crond.pid && \
    usermod -a -G crond-users 1001510000

ADD entrypoint.sh /code/
USER 1001510000

CMD ["/code/entrypoint.sh", "top"]

提示2。

尝试避免多次使用相同的Dockerfile指令(如果您使用的是4x RUN)。每个指令在以后的构建映像中都是一个单独的层。这就是已知的Dockerfile best practice

  

最小化层数在较旧版本的Docker中,   重要的是,您要尽量减少图像中的层数   确保他们表现出色。以下功能已添加到   减少此限制:

     

在Docker 1.10及更高版本中,仅创建RUN,COPY,ADD指令   层。其他说明创建临时的中间映像,并且   不要直接增加构建的大小。