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

19
我正在使用以下的 Dockerfileentrypoint.sh。我需要以非 root 用户身份在容器中启动 crond 服务,但是我遇到了 Permission denied 错误。如何以非 root 用户身份启动 crond 服务?
由于 Openshift 3 平台的强制管理设置,我需要在 Dockerfile 中设置 USERDockerfile
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个回答

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指令(在你的情况下,你有4个RUN)。每个指令都是后续构建镜像中的一个单独层。这是已知的Dockerfile最佳实践

最小化层数 在早期版本的Docker中,最小化镜像层数以确保它们的性能非常重要。为了减少此限制,添加了以下功能:

在Docker 1.10及更高版本中,只有RUN、COPY、ADD指令会创建层。其他指令将创建临时中间映像,不会直接增加构建大小。


3
只有在执行 "crond start" 命令后,才会创建 "/var/run/crond.pid" 文件。因此,"chgrp crond-users /var/run/crond.pid" 命令会失败,并显示以下错误信息:"chgrp: 无法访问 '/var/run/crond.pid':没有那个文件或目录"。 - MajorXbox
@MajorXbox 糟糕 :( 我没想到这个文件是动态创建的。好吧,你总是可以针对文件夹/run执行相同操作。但请记住,要在/run上执行此操作,因为在我的情况下/var/run仅链接到此文件夹。 - Raoslaw Szamszur
1
/var/run 在我的情况下也是链接的。但是对 /run 进行 chgrp 也没有起作用。 - MajorXbox
@MajorXbox,请看一下我的修改。对于我来说,您的情况运行良好。恐怕我无法重现。 - Raoslaw Szamszur
1
你说得对,crond 需要其他权限。我也尝试过使用守护进程和在重启命令中启动进程,但是出现了相同的错误。无论如何,我已经放弃使用 crond 了。感谢你的关注。 - MajorXbox
显示剩余2条评论

-2
建议按照OpenShift容器平台特定的指南再次构建,例如相关的uid和gid。

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