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"]
我想做的事情:
- 运行 我的
run.sh
(我做到了。)
- 在我的容器中设置一个 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
是我犯的错误。
好的,首先我阅读了一些关于这个主题的帖子。这就是我最终得到解决方案的方式。我仍然没有发现我的错误。我也是初学者。
所以这是我的 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"]
我想做的事情:
- 运行 我的
run.sh
(我做到了。) - 在我的容器中设置一个 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 of2&>1
. Second. runls -lh /app/cron.sh
to see if your file is copied. Also be surecron.sh
is in the directory where yourDockerfile
is.
2&>1
是我犯的错误。