Docker容器未运行crontab

时间:2019-10-28 00:47:45

标签: docker dockerfile docker-swarm

我有一个基于ubuntu的dockerfile映像。 Iam试图每天运行bash脚本,但cron从未运行。当容器运行时,我检查cron是否正在运行。 bash脚本可以完美运行,并且crontab命令可以很好地复制到容器内。我似乎找不到问题的根源。

这是Dockerfile:

FROM snipe/snipe-it:latest

ENV TZ=America/Toronto

RUN apt-get update \
    && apt-get install awscli -y \
    && apt-get clean \
    && apt-get install cron -y \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /var/www/html/backups_scripts /var/www/html/config/scripts

COPY config/crontab.txt /var/www/html/backups_scripts
RUN /usr/bin/crontab /var/www/html/backups_scripts/crontab.txt

COPY config/scripts/backups.sh /var/www/html/config/scripts

CMD ["cron","-f"]

最后一条命令CMD不起作用。并且,一旦我删除了cmd命令,当我检查容器内的cron任务时,就会收到此消息:

root@fcfb6052274a:/var/www/html# /etc/init.d/cron status
 * cron is not running

即使我在crontab之前启动了cron进程,crontab仍然没有启动

此dockerfile由docker swarm文件(组成文件类型)调用。也许必须使用撰写文件激活cron。

我该如何解决这个问题???谢谢

2 个答案:

答案 0 :(得分:0)

您需要以不同的方式处理此问题,因为您必须记住容器映像和容器不是虚拟机。它们是一个单一的过程,可以在整个生命周期中启动和维护。因此,容器中不存在后台进程(如cron)。

我看到的大多数人所做的就是让容器在do_the_thing.sh之类的工作上执行您要寻找的内容,然后在主机上使用docker run命令通过cron调用它。

为了便于讨论,假设您有一个名为myrepo / task的图像,其默认入口点为do_the_thing.sh

在主机上,您可以向crontab添加一个条目:

# m h dom mon dow user  command
0 */2    * * *   root    docker run --rm myrepo/task

然后,这取决于设计问题。如果任务需要文件,则可以通过卷向下传递它们。如果需要在完成时将其放置在某处,则可以查看blob存储。

答案 1 :(得分:0)

我认为这个问题是重复的,给出了详细的答复,并带有很多支持here。我遵循了没有问题的最顶层dockerfile示例。

您的CMD在前台运行cron并不是问题。我运行了您的docker文件的快速版本,然后执行到可以确认cron在运行的容器中。推荐检查crontab文件中的cron条目如何重定向其输出。

在这里扩展其他答案之一,实际上是一个容器非常类似于虚拟机,并且它们经常并发运行许多进程。如果您碰巧还有其他容器在运行,则可以通过运行docker stats并查看PID列来最轻松地看到这一点。

此外,您也可以像这样轻松地进行交互式检查:

$ # Create a simple ubuntu running container named my-ubuntu
$ docker run -it -h my-ubuntu ubuntu
root@my-ubuntu$ ps aw # Shows bash and ps processes running.
root@my-ubuntu$ # Launch a ten minute sleep in the background.
root@my-ubuntu$ sleep 600 &
root@my-ubuntu$ ps aw # Now shows sleep also running.