Docker контейнер не запускается crontab - PullRequest
0 голосов
/ 28 октября 2019

У меня есть образ dockerfile, основанный на Ubuntu. Я пытаюсь заставить bash-скрипт запускаться каждый день, но cron никогда не запускается. Когда контейнер работает, я проверяю, запущен ли cron и работает ли он. скрипт bash работает отлично, а команда crontab хорошо скопирована внутри контейнера. Я не могу найти, откуда проблема.

Вот файл Docker:

FROM snipe/snipe-it:latest

ENV TZ=America/Toronto

RUN apt-get update \
    && apt-get install awscli -y \
    && apt-get clean \
    && apt-get install cron -y \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /var/www/html/backups_scripts /var/www/html/config/scripts

COPY config/crontab.txt /var/www/html/backups_scripts
RUN /usr/bin/crontab /var/www/html/backups_scripts/crontab.txt

COPY config/scripts/backups.sh /var/www/html/config/scripts

CMD ["cron","-f"]

Последняя команда CMD не работает. И как только я удаляю команду cmd, я получаю это сообщение при проверке задачи cron внутри контейнера:

root@fcfb6052274a:/var/www/html# /etc/init.d/cron status
 * cron is not running

Даже если я запускаю процесс cron до crontab, crontab все еще не запускается

Этот dockerfile вызывается файлом роя Docker (тип файла compose). Может быть, cron должен быть активирован с помощью файла compose.

Как я могу решить эту проблему ??? Спасибо

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я думаю, что этот вопрос является дубликатом, с подробным ответом с большим количеством голосов здесь . Я без проблем последовал примеру самого верхнего файла dockerfile.

Ваша CMD, на которой запущен cron на переднем плане, не является проблемой. Я запустил быструю версию вашего файла Docker и, запустив в контейнер, смог подтвердить, что cron работаетРекомендуем проверить, как ваши записи cron в файле crontab перенаправляют свой вывод.

Расширение на один из других ответов здесь, контейнер на самом деле очень похож на виртуальную машину, и часто они запускают много процессов одновременно,Если у вас есть другие запущенные контейнеры, вы можете легко увидеть это, запустив docker stats и просмотрев столбец PID.

Кроме того, вы можете легко проверить себя в интерактивном режиме, например:

$ # Create a simple ubuntu running container named my-ubuntu
$ docker run -it -h my-ubuntu ubuntu
root@my-ubuntu$ ps aw # Shows bash and ps processes running.
root@my-ubuntu$ # Launch a ten minute sleep in the background.
root@my-ubuntu$ sleep 600 &
root@my-ubuntu$ ps aw # Now shows sleep also running.
0 голосов
/ 28 октября 2019

Вам нужно подходить к этому по-другому, поскольку вы должны помнить, что образы контейнеров и контейнеры не являются виртуальными машинами. Это единый процесс, который запускается и поддерживается в течение всего жизненного цикла. Таким образом, фоновые процессы (например, cron) не существуют в контейнере.

То, что я видел у большинства людей, это то, что контейнер просто выполняет все, что вы ищете, для выполнения работы, такой как do_the_thing.sh, а затем с помощью команды docker run на хост-компьютере, чтобыпозвони через cron.

Итак, в качестве аргумента, допустим, у вас было изображение myrepo / task с точкой входа по умолчанию do_the_thing.sh

На хосте вы можете добавить запись в crontab:

# m h dom mon dow user  command
0 */2    * * *   root    docker run --rm myrepo/task

Тогда все сводится к вопросу дизайна. Если задаче нужны файлы, вы можете передать их через том. Если нужно что-то положить, когда это будет сделано, возможно, посмотрите на хранилище BLOB-объектов.

...