簡體   English   中英

當我啟動我的 docker 容器時,Cron 沒有運行

[英]Cron isn't running when I start my docker container

作為序言,我一直在參考這兩篇文章尋求幫助:

我的目標是在啟動 docker 容器時自動啟動 cron 作業。 目前,它不會自動啟動,但我可以手動進入我的容器並運行service cron start ,它會啟動作業,並且它可以正常工作。

所以問題是:當我的容器啟動時,如何讓我的 cron 作業自動啟動?

文件

FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron

COPY . /app

WORKDIR /app

ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN crontab -u root /etc/cron.d/crontab
RUN touch /var/log/cron.log

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD cron && tail -f /var/log/cron.log
CMD service cron start

定時任務表

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space

雖然我無法讓 cron 在那個特定的容器中工作,但我能夠專門為 cron 創建一個獨立的 docker 容器,並成功地讓它自動運行。

至於 cron 容器的設置,我遵循了鏈接的文章,使用 Docker 運行 cron 作業 - Julien Boulay ,並且能夠讓它工作。

我正在做的是讓 CMD 直接像這樣調用 cron:

CMD /usr/sbin/cron -f

在此之前,我將 crontab 添加到容器中,並使用以下命令將其分配為根 crontab:

RUN crontab /root/mycrontab

您不需要對位於/etc/cron.d文件調用 crontab 命令,但您確實需要這些文件具有正確的語法。 使用你的例子,而不是這個:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1

你應該有這個:

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

在您的 crontab 文件中。 這僅適用於位於/etc/cron.d的 crontab 文件,否則您的 crontab 文件語法是正確的,您可以使用crontab命令加載它。

從你的例子開始,我認為你應該像這樣修改你的文件:

文件

FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron

COPY . /app

WORKDIR /app

ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN touch /var/log/cron.log

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD /usr/sbin/cron -f

定時任務表

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

另一種選擇是:

文件

FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron

COPY . /app

WORKDIR /app

ADD crontab /root/
RUN crontab /root/crontab
RUN touch /var/log/cron.log

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD /usr/sbin/cron -f

定時任務表

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1

我們在php-fpm和 docker 上遇到了問題,我們的 cronjob 任務沒有被執行。 我們解決了兩個問題:

  • 我們嘗試使用COPY config/custom-cron /etc/cron.d/custom-croncrontab文件復制到 docker 容器中。 問題是,我們的行尾windows格式的。 這確實破壞了我們的 crontab 文件,因為在將該文件復制到容器時不會轉換此行結尾。
  • 第二個問題是,我們試圖通過CMD ["cron", "-f"]啟動 cron CMD ["cron", "-f"]這確實阻塞了主要的php-fpm進程。 這會在調用我們的 Web 應用程序時導致502 Bad gateway錯誤。

最后,我們通過手動編輯 crontab 文件來實現它,同時構建 docker 鏡像而不是復制粘貼,並使用 supervisord 在 docker 中運行多個任務。 這應該適用於所有支持的操作系統。

文件

FROM php:7.1.16-fpm

RUN apt-get update && apt-get install -y cron supervisor

# Configure cron
RUN crontab -l | { cat; echo "* * * * * echo 'Hello world' >> /var/log/cron-test.log 2>&1"; } | crontab -

# Configure supervisor
COPY config/supervisord.conf /etc/supervisor/supervisord.conf

配置文件

[supervisord]
logfile = /dev/null
loglevel = info
pidfile = /var/run/supervisord.pid
nodaemon = true

[program:php-fpm]
command = php-fpm
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0

[program:cron]
command = cron -f
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0

基於 Debian 的發行版中存在一個錯誤,它會導致 cronjobs 失敗,因為 docker 使用分層文件系統並且 cron 無法啟動並顯示NUMBER OF HARD LINKS > 1 (/etc/crontab)

修復很簡單,將touch /etc/crontab /etc/cron.*/*到容器的入口點。

我在這里發表了一篇博文,解釋了如何在 Docker 容器中設置 cron: https : //esc.sh/blog/cron-jobs-in-docker/

我知道這是一個老問題,但我在 Debian 上找到了解決方法,它解決了我的問題。 帶有 uid 的 Cron pam auth 使我的 cron 無法運行。

RUN sed -i '/session    required     pam_loginuid.so/c\#session    required     pam_loginuid.so/' /etc/pam.d/cron

暫無
暫無

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

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