我是新手。设法创建一个脚本,从网上获取信息,并填充一个SQL数据库。
但是,我需要让它每分钟运行一次。
所以我修改了我的工作Dockerfile并添加了以下内容:
Dockerfile:
RUN apt-get install -y cron
COPY cronms /etc/cron.d/cronms
RUN chmod 0644 /etc/cron.d/cronms
RUN crontab /etc/cron.d/cronms
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
#CMD [ "python3", "./my_script.py" ] -- command before cron
my cronms file:
*/1 * * * * /usr/bin/python3 /my_script.py
映像构建时没有错误,但是运行时没有下载数据。
我错过了什么?
感谢您的crontab文件语法不正确。来自cron
手册页:
系统crontab (
/etc/crontab
)和包crontabs (/etc/cron.d/*
)使用相同的格式,不同之处在于命令的用户名在时间和日期字段之后和命令之前。
所以你的cronms
文件应该看起来像:
*/1 * * * * root /usr/bin/python3 /my_script.py
我假设你的问题中的Dockerfile
被截断了,但值得注意的是,要做到这一点,你可能需要显式地安装python3
和cron
,这取决于你使用的是哪个基本映像。
如果我使用Dockerfile
:
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y cron python3
COPY cronms /etc/cron.d/cronms
RUN chmod 0644 /etc/cron.d/cronms
RUN crontab /etc/cron.d/cronms
RUN touch /var/log/cron.log
COPY my_script.py /my_script.py
CMD cron && tail -f /var/log/cron.log
And thiscronms
:
*/1 * * * * root /usr/bin/python3 /my_script.py
And thismy_script.py
:
#!/usr/bin/python3
import time
with open("/tmp/datafile", "a") as fd:
fd.write(time.ctime())
fd.write("n")
然后我可以确认一切工作如预期:脚本是每分钟执行一次。
注意没有写入/var/log/cron.log
,因为cron
的日志是syslog,而不是文件。要查看在cron
中,您需要安排运行一个syslog守护进程,或者使用不同的cron守护进程(例如,busyboxcrond
命令可以日志到文件或标准错误。