docker容器中的cronjob未运行

好的,首先我阅读了一些关于这个主题的帖子。这就是我最终得到解决方案的方式。我仍然没有发现我的错误。我也是一个初学者。

所以这是我的码头文件:

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
stack overflow Cronjob in docker container not running
原文答案
author avatar

接受的答案

正如 Saeedthis comment 中所说

首先,你的 cronjob 命令是错误的。您应该使用 2>&1 而不是 2&>1 。第二。运行 ls -lh /app/cron.sh 以查看您的文件是否被复制。还要确保 cron.sh 在您的 Dockerfile 所在的目录中。

2&>1 是我犯的错误。


答案:

作者头像

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

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

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

作者头像

我有一个类似的问题,没有读取 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 复制权限)