簡體   English   中英

在 Docker 映像中以非 root 用戶身份運行 cronjob 的正確方法是什么?

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

附加信息

您可能會覺得有趣的其他一些解決方案:

  1. https://github.com/aptible/supercronic/
  2. https://hub.docker.com/r/blacklabelops/logrotate https://github.com/blacklabelops/logrotate
  3. https://medium.com/@geekidea_81313/running-cron-jobs-as-non-root-on-alpine-linux-e5fa94827c34

像(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM