当我启动我的docker集装箱时,Cron没有运行

为了序言,我一直在引用这两篇文章来寻求帮助:

  • 用Docker运行cron作业 – Julien Boulay
  • 在Docker容器中运行cron作业 – Chris S.

我的目标是在启动Docker容器时自动启动cron作业。 目前,它不会自动启动,但我可以手动进入我的容器,并运行service cron start ,启动作业,它可以正常工作。

所以问题是: 当我的容器启动时,如何让我的cron作业自动启动?

Dockerfile

 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 

crontab中

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

我正在做的是直接像这样的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命令加载它。

从你的例子开始,我认为你应该像这样修改你的文件:

Dockerfile

 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 

crontab中

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

另一种select是:

Dockerfile

 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 

crontab中

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

虽然我无法在特定的容器中获得cron的工作,但是我能够专门为cron创build一个独立的docker容器,并成功地让它自动运行。

就cron容器的设置而言,我遵循链接的文章, 使用Docker运行一个cron作业 – Julien Boulay ,并能够正常工作。

在基于Debian的发行版中存在一个错误,这将导致cronjobs失败,因为docker使用分层文件系统,并且cron不会启动,并且表示NUMBER OF HARD LINKS > 1 (/etc/crontab)

修复很简单,把touch /etc/crontab /etc/cron.*/*到容器的入口点。

我做了一篇博客文章,解释如何在Docker容器中设置cron: https : //digitz.org/blog/cron-jobs-in-docker/