docker 容器中的 Cronjob 未运行

问题描述 投票:0回答:5

我是 cronjobs 的初学者。我花了一些时间阅读 StackOverflow 上的各种帖子,这就是我想出下面的解决方案的方法。它仍然无法按照我想要的方式工作,也许有人可以提供帮助?

这是我的 Docker 文件:

FROM conda/miniconda3
WORKDIR /app

RUN apt-get update -y
RUN apt-get install cron -y
RUN apt-get install curl -y


RUN conda update -n base -c defaults conda

RUN conda install mamba -n base -c conda-forge

COPY ./environment.yml ./environment.yml
RUN mamba env create -f environment.yml

# Make RUN commands use the new environment:
SHELL ["conda", "run", "--no-capture-output", "-n", "d2", "/bin/bash", "-c"]

#Setup cron
COPY ./cronjob /etc/cron.d/cronjob
RUN crontab /etc/cron.d/cronjob
RUN chmod 0600 /etc/cron.d/cronjob
RUN touch ./cron.log

COPY ./ ./

RUN ["chmod", "+x", "run.sh"]

ENTRYPOINT ["sh", "run.sh"]
CMD ["cron", "-f"]

我想做的是:

  1. 运行我的
    run.sh
    (我已经设法让它工作)
  2. 在我的容器内设置一个 cronjob,该任务在名为
    cronjob
    的文件中定义(请参阅下面的内容)

cronjob 不起作用,为什么? 请注意,cron.log 为空。它永远不会被触发。

crontab -l
(在容器内部运行)的输出是:

$ crontab -l
# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1

定时作业

# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1

docker cron
5个回答
3
投票

我也遇到了类似的问题,无法读取 crontab

我也使用过类似的东西:

COPY ./cronjob /etc/cron.d/cronjob

本地

cronjob
文件的权限为 664 而不是 644。这导致 cron 记录
Sep 29 16:21:01 0f2c2e0ddbfd cron[389]: (*system*crontab) INSECURE MODE (group/other writable) (/etc/cron.d/crontab)
(我实际上必须安装 syslog-ng 才能看到这种情况发生)。

事实证明,如果其他人可写,cron 将拒绝读取 cron 配置。我想事后看来这是有道理的,但我完全没有注意到这一点。

将我的 cronjob 文件权限更改为 644 为我解决了这个问题(我在本地文件系统上执行了此操作,Dockerfile 复制了权限)


1
投票

正如Saeed此评论

中所说

首先,你的cronjob命令是错误的。您应该使用

2>&1
而不是
2&>1
。第二。运行
ls -lh /app/cron.sh
查看您的文件是否已复制。另请确保
cron.sh
位于您的
Dockerfile
所在的目录中。

2&>1
是我犯的错误。


1
投票

只有你需要root才能解决问题

*/15 * * * * root /bin/sh /app/cron.sh >> /app/cron.log 2&>1


0
投票

正如 Saeed 已经指出的那样,有理由相信您没有将 cron.sh 脚本放入容器中。

最重要的是,对 cron 进行编程,使其不会在任何地方记录失败的调用。您可以尝试打开一些调试日志记录(几年前我几乎不得不搜索 cron 的源代码才能找到正确的设置)。最后 cron 会将其调试输出发送到 syslog - 但在您的容器中只有 cron 正在运行,因此日志条目可能会再次在该阶段丢失。

这最终意味着你处于黑暗之中,需要找到针。但安装脚本是第一次良好的尝试。


0
投票

我的问题是当我在容器中运行 crontab 时,我没有指定将运行 crontab 脚本的用户。

echo "* * * * * /usr/local/bin/cron_job.sh >> /var/log/cron.log 2>&1" > /etc/cron.d/fetch_crl_cron 

而不是

 echo "* * * * * root /usr/local/bin/cron_job.sh >> /var/log/cron.log 2>&1" > /etc/cron.d/fetch_crl_cron

为此必须下载 syslog-ng。

Oct  9 06:46:08 rabbitmq cron[25178]: Error: bad username; while reading /etc/cron.d/cron_job
© www.soinside.com 2019 - 2024. All rights reserved.