如何在 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 【问题描述】:我正在使用下面的Dockerfile
和entrypoint.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 用户身份工作