簡體   English   中英

如何從Ruby映像在Docker容器中運行cron

[英]How to run cron in Docker container from Ruby image

我曾嘗試將cron設置為在我的Docker容器中運行,但到目前為止沒有成功。

這是Dockerfile與cron相關的部分:

FROM ruby:2.2.2

# Add crontab file in the cron directory
RUN apt-get install -y rsyslog
ADD crontab /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod +x /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
RUN service cron start

當我登錄到容器實例時,cron似乎正在運行:

$ service cron status
cron is running.

/etc/cron.d有我的工作:

$ cat /etc/cron.d/hello-cron
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

但是/var/log/cron.log中未附加任何內容,因此它似乎沒有運行。

如果然后我在容器中運行$ cron它將注冊我的hello-cron文件,並且日志文件將每分鍾附加“ Hello world”。

您的分析是正確的,cron作業未運行。 發生這種情況是因為通常情況下,按照最佳實踐,該容器僅運行一個進程,例如Apache,NGINX等-它不運行任何正常的操作系統守護程序(例如crond)。

沒有crond意味着沒有任何東西可以讀取或執行您的crontab。

有幾種方法可以解決此問題,但據我所知沒有完美的解決方案。

  • 最糟糕的是實際安裝crond,以及類似supervisord的東西。 它使您的容器大大復雜。

  • 您可以創建一個單獨的容器,僅運行cron。 將其他容器中所需的任何內容掛載為卷。 通常建議使用此選項,但它有局限性。 cron容器需要了解其他容器的內部知識,並且cron作業不會在與其他容器相同的上下文中執行。

  • 您可以在主機上創建cron作業,並使用docker exec在容器中執行腳本。 效果很好,但是在主機和容器之間建立了依賴關系。 如果您無權訪問主機的操作系統(例如,在托管情況下,或者由其他團隊管理主機),則它也可能根本無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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