【问题标题】:Cronjob in docker container not runningdocker容器中的cronjob未运行
【发布时间】:2022-01-27 17:52:22
【问题描述】:

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

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

【问题讨论】:

  • 首先,你的cronjob命令是错误的。你应该有2>&1 而不是2&>1。第二。运行ls -lh /app/cron.sh 以查看您的文件是否被复制。还要确保cron.sh 位于您的Dockerfile 所在的目录中。
  • 一个Docker容器只运行一个命令;如果您同时指定ENTRYPOINTCMDthey are combined together,那么您的容器运行的单个命令是sh run.sh cron -f。在一个容器中只运行一个命令通常更容易,这里典型的最佳实践是运行一个单独的 cron 容器。 (考虑将run.sh 设为CMD,而不是ENTRYPOINT,使用docker run 选项更容易覆盖。)
  • @Saeed 1. 好点。我会解决的。 2. 被复制了。 3. 我确认它在同一个目录中。这就是解决办法。谢谢。
  • @DavidMaze 我想我不想覆盖。但是你会在 run.sh 中调用 cron -f 吗?
  • 我会运行一个单独的容器。 docker run ... your-image cron -f 或使用 Compose command: 非常简单。

标签: docker cron


【解决方案1】:

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

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

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

【讨论】:

  • 2&>1 是错误
  • 很好,你找到了。如果有人想知道 cron 日志记录,我会在这里留下我的答案。
【解决方案2】:

正如Saeedthis comment所说的

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

2&>1 是我犯的错误。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2023-04-10
    • 2017-06-27
    • 2022-06-15
    • 2020-12-06
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多