我正在嘗試在呼叫 shell 腳本的 docker 容器內執行 cronjob。
昨天我一直在網路上搜尋和堆疊溢出,但我找不到真正有效的解決方案。
我怎樣才能做到這一點?
P粉5638310522023-10-11 17:56:26
接受的答案在生產環境中可能是危險的。
當您使用CMD cron && tail -f /var/log/cron.log
時,cron進程基本上會分叉以便在後台執行cron
,主進程退出並讓您在前台執行tailf
。後台 cron 進程可能會停止或失敗,您不會注意到,您的容器仍將靜默運行,並且您的編排工具不會重新啟動它。
使用基本的 shell 重定向,您可能想要執行以下操作:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
你的 CMD 將會是:CMD ["cron", "-f"]
#但是:如果你想執行任務 作為非根用戶。
P粉8181258052023-10-11 16:39:03
您可以將 crontab
複製到映像中,以便從該映像啟動的容器執行該作業。
重要:如docker-cron 問題 3< 中所述< /a>:對 cron
檔案使用 LF,而不是 CRLF。
請參考使用Docker 執行cron 作業」 /github.com/julienboulay" rel="noreferrer">Julien Boulay 在他的<代码>Ekito/docker -cron:
# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows) * * * * * echo "Hello world" >> /var/log/cron.log 2>&1 # An empty line is required at the end of this file for a valid cron file.
如果您想知道2>&1
是什麼,Ayman Hourieh 解釋。
FROM ubuntu:latest MAINTAINER docker@ekito.fr RUN apt-get update && apt-get -y install cron # Copy hello-cron file to the cron.d directory COPY hello-cron /etc/cron.d/hello-cron # Give execution rights on the cron job RUN chmod 0644 /etc/cron.d/hello-cron # Apply cron job RUN crontab /etc/cron.d/hello-cron # Create the log file to be able to run tail RUN touch /var/log/cron.log # Run the command on container startup CMD cron && tail -f /var/log/cron.log
但是:如果cron
死亡,容器繼續執行。
(請參閱 Gaafar 的 評論和如何讓 apt-get
安裝時噪音較小?:
apt-get -y install -qq --force-yes cron
也可以工作)
如 Nathan Lloyd 在 評論:
或者,確保您的作業本身直接重定向到 stdout/stderr 而不是日誌文件,如 hugoShaka 中所述的答案:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
將最後一個 Dockerfile 行替換為
CMD ["cron", "-f"]
但是:如果你想執行任務 作為非根用戶。
另請參閱(關於cron -f
,即cron「前台」)「docker ubuntu cron -f
不起作用」
建置並運行它:
sudo docker build --rm -t ekito/cron-example . sudo docker run -t -i ekito/cron-example
Hello world Hello world
docker CMDtail -f 輸出> 未顯示」。
在Docker 中執行Cron」以了解更多資訊(2021 年4 月)來自Jason Kulatunga,因為他評論如下
檢視 Jason 的映像 AnalogJ/docker-cron
基於:
Dockerfile 安裝 cronie
/crond
,取決於發行版。
入口點初始化/etc/environment
然後呼叫
cron -f -l 2