当我启动docker容器时,Cron没有运行

Tor*_*ory 12 cron docker docker-compose asp.net-core

作为序言,我一直在参考这两篇文章寻求帮助:

我的目标是在启动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
Run Code Online (Sandbox Code Playgroud)

crontab中

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space
Run Code Online (Sandbox Code Playgroud)

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

至于cron容器的设置,我按照链接的文章,使用Docker运行一个cron作业 - Julien Boulay,并且能够使它工作.

Alv*_*jal 11

我正在做的是像这样直接调用CMD调用cron:

CMD /usr/sbin/cron -f
Run Code Online (Sandbox Code Playgroud)

在此之前,我将crontab添加到容器中,并使用以下命令将其指定为root crontab:

RUN crontab /root/mycrontab
Run Code Online (Sandbox Code Playgroud)

您不需要对位于其中的文件调用crontab命令/etc/cron.d,但您确实需要这些文件具有正确的语法.使用您的示例,而不是:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

你应该这样:

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

在您的crontab文件上.这仅适用于位于其中的crontab文件/etc/cron.d,否则您的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
Run Code Online (Sandbox Code Playgroud)

crontab中

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

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
Run Code Online (Sandbox Code Playgroud)

crontab中

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)


lin*_*lin 5

我们在php-fpm和 docker 上遇到了问题,我们的 cronjob 任务没有被执行。我们解决了两个问题:

  • 我们尝试使用 将crontab文件复制到 docker 容器中COPY config/custom-cron /etc/cron.d/custom-cron。问题是,我们的行尾windows格式的。这确实破坏了我们的 crontab 文件,因为在将该文件复制到容器时不会转换此行结尾。
  • 第二个问题是,我们试图启动 cron,CMD ["cron", "-f"]它确实阻塞了主php-fpm进程。这会导致在502 Bad gateway调用我们的 Web 应用程序时出错。

最后,我们通过手动编辑 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
Run Code Online (Sandbox Code Playgroud)

配置文件

[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
Run Code Online (Sandbox Code Playgroud)