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

Posted

技术标签:

【中文标题】如何在 Docker 容器中以非 root 用户身份启动 cron?【英文标题】:How to start crond as non-root user in a Docker Container? 【发布时间】:2019-04-05 19:34:35 【问题描述】:

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

我需要在 Dockerfile 中添加 USER,因为这是我的 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

【问题讨论】:

【参考方案1】:

根据OpenShift Container Platform-Specific Guidelines 重新构建怎么样?比如相关的uid和gid。

【讨论】:

【参考方案2】:

首先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

此外,docker 默认入口点是/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 创建 层。其他指令创建临时中间图像,以及 不要直接增加构建的大小。

【讨论】:

/var/run/crond.pid 直到 crond start 执行后才会创建,所以 chgrp crond-users /var/run/crond.pid 失败并出现以下错误 chgrp: cannot access '/var/run/crond.pid': No such file or directory @raoslaw @MajorXbox Shieeet :( 我没有想到这个文件是动态创建的。好吧,你总是可以使用相同的文件夹 /run 而不是文件。但记得在/run 因为/var/run 仅链接到此文件夹(至少在我的情况下)。 /var/run 在我的案例中也有链接。但是chgrp 上的/run 也不起作用。 @MajorXbox 请查看编辑。对我来说,你的情况很好。恐怕我无法复制。 你是对的 crond 需要其他权限。还尝试了具有相同错误的重启命令的守护进程和启动进程。无论如何,我不再使用crond。感谢您查看此内容。

以上是关于如何在 Docker 容器中以非 root 用户身份启动 cron?的主要内容,如果未能解决你的问题,请参考以下文章

Firefox headless 不能在 Docker 中以非 root 用户身份工作

在 Docker 中以非 root 用户身份运行应用程序

如何在官方 docker php 映像上以非 root 用户身份运行 composer

以非 root 用户身份运行 Nginx

如何以非 root 用户身份使用 CPAN?

如何在 Debian 上以非 root 用户身份运行 Spring Boot 应用程序?