Docker запускает службу cron, но при открытии терминала он больше не работает? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть простая настройка Dockerfile и docker compose для тестирования cron в контейнере.

В качестве последнего шага запускается cron, и я получаю сообщение о том, что cron запущен, но когда я захожу в контейнер и проверяю состояние службы cron, она не работает. Как это возможно?

Мне кажется, я что-то неправильно понимаю, но не могу понять, что это такое.

Dockerfile:

FROM ubuntu:bionic

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Install Cron
RUN apt-get update && apt-get install cron

# Install the crontab
COPY crontab /etc/cron.d/crontab

# Is this needed??
RUN touch /var/log/cron.log
RUN chmod 777 /var/log/cron.log

# Run the command on container startup
CMD service cron start && tail -f /var/log/cron.log

докер-compose.yml

version: '3'
services:

  cron:
    # build a custom image
    build:
      context: .
      dockerfile: Dockerfile

    # a name for easier reference
    image: cron

Файл crontab действителен и содержит:

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required.

Затем, начиная с: Выход:

Creating network "docker-cron_default" with the default driver
Building cron
Step 1/8 : FROM ubuntu:bionic
 ---> 4c108a37151f
Step 2/8 : MAINTAINER wouter.samaey@storefront.be
 ---> Using cache
 ---> 0d9fa7049481
Step 3/8 : RUN touch /var/log/cron.log
 ---> Using cache
 ---> 39bb838fe945
Step 4/8 : RUN apt-get update && apt-get install cron
 ---> Using cache
 ---> d3ce6cc03821
Step 5/8 : COPY crontab /etc/cron.d/crontab
 ---> Using cache
 ---> fab99f2e2e77
Step 6/8 : RUN touch /var/log/cron.log
 ---> Using cache
 ---> c7fab49def98
Step 7/8 : RUN chmod 777 /var/log/cron.log
 ---> Using cache
 ---> 7dc00a5913bd
Step 8/8 : CMD service cron start && tail -f /var/log/cron.log
 ---> Running in a4bdec436613
Removing intermediate container a4bdec436613
 ---> 97c867e25091
Successfully built 97c867e25091
Successfully tagged cron:latest
Creating docker-cron_cron_1 ... done
Attaching to docker-cron_cron_1
cron_1  |  * Starting periodic command scheduler cron
cron_1  |    ...done.

Но когда я открываю оболочку bash в этом контейнере, cron НЕ запускается:

docker run -it cron /bin/bash

root@d6649b402133:/# /etc/init.d/cron status
 * cron is not running

Как это возможно?

1 Ответ

2 голосов
/ 05 июля 2019

Контейнер Docker запускает только один процесс.Когда вы

docker run --rm -it imagename bash

, оболочка запускает вместо CMD в Dockerfile.

Обычно рекомендуется запускать то, что вы хотите запустить какпроцесс переднего плана.В вашем примере, если есть какая-то ошибка, которая приводит к сбою crond, вы никогда не заметите, так как основной процесс вашего контейнера - «спит вечно».Соответственно, получение интерактивных оболочек в таких контейнерах, как вы показываете, действительно полезно для отладки («если мой файл не в /etc/cron.d, то где он на самом деле?»), Но это не совсем стандартный способ работы с Docker.

Вкратце: я бы изменил последнюю строку вашего Dockerfile на

CMD ["crond", "-n"]

, чтобы демон запускался как процесс переднего плана, и не беспокоился о попытке получить оболочку в то же время.время.

...