【问题标题】:Docker container does not run crontabDocker 容器不运行 crontab
【发布时间】:2019-10-28 00:47:45
【问题描述】:

我有一个基于 ubuntu 的 dockerfile 映像。我试图让 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 必须用 compose 文件激活。

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

【问题讨论】:

    标签: docker dockerfile docker-swarm


    【解决方案1】:

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

    我看到大多数人所做的就是让容器执行您希望它在do_the_thing.sh 之类的工作上执行的任何操作,然后在主机上使用docker run 命令通过以下方式调用它克朗。

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

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

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

    然后就是设计问题了。如果任务需要文件,您可以通过卷传递它们。如果它需要在完成后将某些东西放在某个地方,也许看看 blob 存储。

    【讨论】:

      【解决方案2】:

      我认为这个问题是重复的,有一个详细的回复,有很多赞成 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-23
        • 2023-03-09
        • 1970-01-01
        • 2018-03-01
        • 2020-02-06
        • 2016-04-02
        • 2015-10-24
        相关资源
        最近更新 更多