[英]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.