Почему Crond не может найти мой сценарий оболочки? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть Dockerfile, как показано ниже, и я пытаюсь запускать скрипт python каждые 15 минут, но получаю ошибку, показанную ниже

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 Ответ

1 голос
/ 06 июля 2019

Я могу воспроизвести вашу проблему, когда файл сценария 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" ]

Конечно, правильный путь - это исправлять окончания строк в вашем файле с самого начала.

InКроме того, вы можете увидеть управляющие символы в файле, запустив
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
...
...