为什么Crond找不到我的Shell脚本?

时间:2019-07-06 04:59:07

标签: python docker cron alpine

我有一个如下所示的Dockerfile,我试图每15分钟运行一个python脚本,但出现以下错误

docker logs 7e1
run-parts: can't execute '/etc/periodic/15min/startjob': No such file or directory

我能够验证run-parts --test正常运行。
cron文件和python文件似乎在docker容器中可用。

docker exec -it 7e1 /bin/sh
/ # run-parts --test /etc/periodic/15min/
/etc/periodic/15min/startjob
/ # ls -lrt /etc/periodic/15min/startjob
-rwxr-xr-x    1 root     root           201 Jul  6 04:09 /etc/periodic/15min/startjob
/ # ls -lrt /app
total 8
-rwxr-xr-x    1 root     root            10 Jul  5 17:36 requirements.txt
-rwxr-xr-x    1 root     root           290 Jul  5 17:38 pyapp2.py
/ # 

------- Dockerfile -----------

FROM python:3.7-alpine
COPY requirements.txt /
RUN pip install -r /requirements.txt
COPY cronscript.sh /etc/periodic/15min/startjob
RUN chmod a+x /etc/periodic/15min/startjob
COPY src/ /app
CMD [ "crond", "-l", "2", "-f" ]

-------- cronscript.sh --------

#!/bin/sh
echo "started $(date)" >> /tmp/job.log
echo "Job started: $(date)"
# Add additional instructions
python /app/pyapp2.py
echo "Job finished: $(date)"
echo "ended $(date)" >> /tmp/job.log

非常感谢任何指针。谢谢

1 个答案:

答案 0 :(得分:1)

当脚本文件cronscript.sh没有正确的行尾时(例如,在Windows CRLF上而不是在LF上),我可以重现您的问题。

如果您在Windows上编辑了该文件,则可以检查Dockerfile中的以下快速修复程序是否可以解决您的问题:

FROM python:3.7-alpine
COPY requirements.txt /
RUN pip install -r /requirements.txt
COPY cronscript.sh /etc/periodic/15min/startjob
RUN chmod a+x /etc/periodic/15min/startjob

# Quick & dirty fix
RUN dos2unix /etc/periodic/15min/startjob

COPY src/ /app
CMD [ "crond", "-l", "2", "-f" ]

当然正确的方法是从一开始就修复文件中的行尾。

此外,您可以通过运行
查看文件中的控制字符 cat -v /etc/periodic/15min/startjob
从您的容器内,例如在将快速修复程序应用到我的机器上的输出之前,应如下所示(注意^M

cat -v /etc/periodic/15min/startjob
#!/bin/sh^M
echo "started $(date)" >> /tmp/job.log^M
echo "Job started: $(date)"^M
...