[英]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-cron
將crontab
文件復制到 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.