[英]What is the proper way to run a cronjob as a non-root user in a Docker image?
自从我在这里发布东西以来已经很长时间了。 我已经为此苦苦挣扎了一段时间,并认为这将是来到这里的最佳时机。
我需要一个可以执行 cron 作业的容器映像。 问题是由于安全原因和最佳实践,我需要以非 root 用户身份运行容器; 但是,默认的 crond (busybox) 不会以非 root 身份执行。 因此,我决定使用dcron ,它是一个轻量级的 cron 守护进程。
Dockerfile:
FROM alpine:3.12.1
RUN apk --no-cache add dcron
RUN adduser -S 11111 -u 11111 -G cron -s /bin/ash && \
chgrp cron /usr/sbin/crond && \
chmod 4770 /usr/sbin/crond
RUN echo "* * * * * date >> /tmp/log/test 2>&1" >> /etc/crontabs/11111
RUN chown 11111 /etc/crontabs/11111
USER 11111
CMD ["crond", "-f"]
问题:
当我运行这个容器时,我得到以下 output: setpgid: Operation not permitted
allowed 。
有趣的是,如果我从 Dockerfile 中省略 CMD 并在 shell 中运行crond -f
,它将正常工作!
任何建议将不胜感激!
因此,经过一番调查,我最终根本没有使用 cron,而是做了一些简单的事情。 不是一个理想的解决方案,但可以满足我目前的需要。 我将在这里分享它,但如果您知道,请分享解决此问题的正确方法。 例如,使用以下“作业”将每 12 小时运行一次:
Dockerfile:
FROM alpine:3.12.1
COPY entrypoint.sh /usr/local/bin
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
入口点.sh
#!/usr/bin/env ash
while true; do
echo "$(date) Hello there!"
sleep "12h"
done
附加信息
您可能会觉得有趣的其他一些解决方案:
像(3)这样的一些建议不起作用,而(1,2)对于我需要的东西来说有点太复杂了。
如果您的 docker 容器以非 root 用户身份运行,则无法启动 cron 守护程序,因为它需要 root 权限才能启动。
https://github.com/aptible/supercronic/值得探索,它为您提供了类似的 cron 集,可以在没有 root 用户权限的情况下运行,它相当于 cron。
从源代码构建:
go get -d github.com/aptible/supercronic
cd "${GOPATH}/src/github.com/aptible/supercronic"
go mod vendor
go install
下载二进制文件:
https://github.com/aptible/supercronic/releases
为了获得更好的性能,您可以将二进制文件存储在 antifactory 中并使用 docker 构建读取。
哈克
您可以交叉构建和生成二进制文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.