docker 容器中的 Cronjob 不是 运行

Cronjob in docker container not running

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

所以这是我的 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

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

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

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

作为Saeed said in

First of all, your cronjob command is wrong. You should have 2>&1 instead of 2&>1. Second. run ls -lh /app/cron.sh to see if your file is copied. Also be sure cron.sh is in the directory where your Dockerfile is.

2&>1 是我犯的错误。