我有一個 docker 映像,它基本上以使用以下構建映像時定義的頻率安排一個 cron 作業。
COPY myjobtime /etc/cron.d/myjobtime
RUN chmod 0644 /etc/cron.d/myjobtime &&\
crontab /etc/cron.d/myjobtime
CMD cron
我在 myjobtime.xml 檔案中有 cron 條目。
*/10 * * * * /usr/local/bin/sh /app/myscript.py
我希望能夠在運行時通過 cron 計劃。這意味著,如果有人想將 cron 計劃修改為不同的頻率,他們應該能夠在運行容器并傳遞包含新 cron 計劃的環境變數檔案時執行此操作。這可以做到嗎?
uj5u.com熱心網友回復:
重要的細節是您需要在容器啟動時創建并安裝 crontab 檔案。我發現一個入口點包裝腳本是一個有用的模式:將影像設定ENTRYPOINT為一個 shell 腳本,它可以執行任何首次設定所需的操作,然后讓它exec "$@"運行影像的CMD.
如果您的映像最終基于基于 GNU 工具集的 Linux 發行版,那么envsubst在這里是一個非常有用的程式。它讀入一個文本檔案,擴展環境變數參考,并寫出結果。我假設你有這個可用;在基于 Alpine 的影像上,您可以使用sed (1)執行類似的技巧(盡管繞過 cron 計劃會變得很棘手)。
這使得入口點包裝腳本類似于:
#!/bin/sh
# entrypoint.sh
# Set a default schedule, if the user didn't provide one
if [ -z "$CRON_SCHEDULE" ]; then
export CRON_SCHEDULE='*/10 * * * *'
fi
# Run substitutions on the template file and inject the crontab
envsubst < /app/myjobtime.cron.tmpl | crontab
# Run the main container command
exec "$@"
由于模板不是“正常”的 crontab,它不能進入??“正常”的 crontab 目錄;把它放在應用程式目錄中就可以了。該檔案有一個環境變數參考,計劃將在哪里
# myjobtime.cron.tmpl
${CRON_SCHEDULE} /app/myscript.py
在您的影像中,將包裝腳本設定為ENTRYPOINT,確保模板檔案位于正確的位置,并CMD保持不變。
# (assuming there's not a broad `COPY . .`)
COPY myjobtime.cron.tmpl .
COPY entrypoint.sh .
ENTRYPOINT ["/app/entrypoint.sh"] # must be JSON-array syntax
CMD cron # unchanged
這應該允許您覆寫 cron 計劃。
docker run -d --name hourly myappcron
docker run -d --name daily -e 'CRON_SCHEDULE=0 0 * * *' myappcron
由于入口點包裝腳本運行提供的任何命令,并且您可以很容易地覆寫該命令,這也可以讓您仔細檢查是否設定了正確的計劃。
docker run --rm -e 'CRON_SCHEDULE=0 0 * * *' myappcron \
crontab -l # runs instead of the cron daemon
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/423114.html
標籤:
