【问题标题】:cron job does not execute in docker containercron 作业不在 docker 容器中执行
【发布时间】:2020-01-18 00:19:32
【问题描述】:

将来自该主题的各种先前答案的解决方案放在一起,但我仍然失败了。这是我的 Dockerfile:

    FROM python:3.7

    RUN apt-get update &&\
        apt-get install -y cron &&\
        apt-get clean

    # do this now to use layer cache mechanism
    COPY requirements.txt /
    RUN pip install -r /requirements.txt


    RUN mkdir -p /usr/local/src/app
    WORKDIR /usr/local/src/app

    ADD script .
    ADD StockLogger.py .
    ADD crontab.txt .
    COPY entry.sh .

    RUN chmod 755 script entry.sh && touch /var/log/cron.log

    CMD ./entry.sh && tail -f /var/log/cron.log

这里是entry.sh

    #!/bin/sh
    set -e

    # start cron
    service cron start

    cp ./crontab.txt /etc/cron.d/

    #fix link-count, as cron is being a pain, and docker is making hardlink count >0 (very high)
    touch /etc/crontab /etc/cron.*/*

    echo Added crontab
    whoami
    echo ***entry.sh done***

这里是 crontab.txt

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    * * * * *   root    echo "Hello world" >> /var/log/cron.log 2>&1
    # Keeping the empty next line

当我使用docker run sprevrha/crontester:latest 运行容器时,CMD 中的tail -f 使其运行良好,但不会产生任何输出。当我执行到正在运行的容器中并使用 cat 检查它时,该文件也是空的。此外,crontab -l 表示 root 没有 cron 作业。 /etc/cron.d/crontab.txt 在那里,它归根用户所有。

    root@16d01a1a2c0c:/usr/local/src/app# ls -l /etc/cron.d                                      
    total 4                                                                                      
    -rwxr-xr-x 1 root root 1020 Jan  7 21:20 crontab.txt   

链接数为 1,所以大概没问题。
我做错了什么?

【问题讨论】:

  • cron 守护进程是否真的在运行?您可能应该让crond,而不是tail,成为主容器进程,这涉及直接将其作为前台进程运行,而不是通过service 启动它。 (我怀疑你启动了 cron,然后做了一些修复以使其工作。)
  • 确实,我以service cron start 开始cron。当我以交互方式查询它时,我得到服务 cron 正在运行的响应。我还需要运行 crond 吗?
  • 不。如果service cron status[OK],它正在运行。不需要 crond。

标签: docker cron


【解决方案1】:

只看了一点文档,不支持像.txt这样的点和后缀,它的路径直接在/etc/

来自文档: /etc/cron.d/ 将所有脚本放在这里并从 /etc/crontab 文件中调用它们。

【讨论】:

  • 好吧,我想通了。对于我的配置,您的回答部分适用。实际上 /etc/crontab 下的文件名称中不能有点,所以我将我的重命名为 mycrontab。但是我不必更改/etc/crontab。见this answer on Unix StackExchange
  • 我很高兴它有助于找到正确的方法。是的,我明白了你的意思,所以基本上任何名称都可以,只是不接受点和后缀。我也稍微更改了我的答案,以便为未来的用户更正它。
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2016-09-24
相关资源
最近更新 更多