我试图在 Docker 容器中每分钟运行我的 python 程序。为此,我想使用 Python 和 cron 构建映像,然后使用 cron 表达式运行
main.py
。
您能否查看我的 Dockerfile 并告诉我为什么没有任何内容执行?即使第二个 cron expr (
echo "OK"
) 也没有写入文件(我已将其添加为调试作业)。
所有日志文件都是空的,就像 cron 根本无法工作一样......
顺便说一句。如果我手动运行
/script.sh
(从 docker 容器),我不会收到任何错误,并且新行会添加到 /app/ROOT.log
。
Dockerfile:
FROM python:3.8-slim-buster
RUN pip install --upgrade pip
RUN apt-get update && apt-get -y install cron
RUN apt-get -y install procps
RUN touch /script.sh
RUN echo "#!/bin/bash" >> /script.sh \
&& echo "" >> /script.sh \
&& echo "cd /app" >> /script.sh \
&& echo "python main.py" >> /script.sh
RUN chmod +x /script.sh
RUN (crontab -l ; echo "*/1 * * * * /bin/bash /script.sh >/app/cron.log 2>&1") | crontab
RUN (crontab -l ; echo "*/1 * * * * echo \"OK\" >>/app/cron.log 2>&1") | crontab
RUN chown app:app /script.sh && chown -R app:app /var/spool/cron/crontabs
RUN touch /var/log/cron.log
WORKDIR /app
# copy requirements.txt file from local (source) to file structure of container (destination)
COPY requirements.txt requirements.txt
# Install the requirements specified in file using RUN
RUN pip3 install -r requirements.txt
# copy all items in current local directory (source) to current container directory (destination)
COPY main.py main.py
CMD /etc/init.d/cron start && tail -f /var/log/cron.log
main.py
:
if __name__ == '__main__':
from datetime import datetime
# save current date time to file
with open('/app/ROOT.log', 'a') as f:
f.write(str(datetime.now()) + '\n')
root@86bbd19a7cb1:/app# ps aux | grep cron
root 1 0.0 0.0 2384 756 ? Ss 12:49 0:00 /bin/sh -c /etc/init.d/cron start && tail -f /var/log/cron.log
root 11 0.0 0.0 7260 2056 ? Ss 12:49 0:00 /usr/sbin/cron
root 12 0.0 0.0 4076 744 ? S 12:49 0:00 tail -f /var/log/cron.log
root 38 0.0 0.0 4832 876 pts/0 S+ 12:54 0:00 grep cron
root@86bbd19a7cb1:/app# ls /var/log/
alternatives.log apt btmp cron.log dpkg.log exim4 faillog lastlog wtmp
root@86bbd19a7cb1:/app# cat /var/log/cron.log
root@86bbd19a7cb1:/app# cat /var/log/lastlog
root@86bbd19a7cb1:/app# cat /var/log/faillog
在您的脚本中,您指的是
/app
文件夹
(/app/cron.log
)
但是您正在检查的文件位于
/var/log/
(/var/log/cron.log
)