Как заставить crond автоматически запускаться на Alpine в контейнере Docker? - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу иметь возможность запускать простой скрипт bash в службе контейнеров в час, используя cron. Я использую Alpine Linux через docker-compose с пользовательским Dockerfile для создания образа на основе php -fpm, на котором я надеюсь также запустить crond - кроме как я не могу.

Выполнение ps aux | grep cron на контейнере после сборки ничего не возвращает.

Из того, что я понимаю, обычные Linux процессы запуска не существуют в Docker контейнерах - отлично - так как мне автозапуск crond? Его каталоги в /etc/periodic/ создаются автоматически, поэтому я не понимаю, почему соответствующий процесс, который использует эти каталоги, также не работает.

Я попытался создать определение выделенного сервиса в docker-compose.yml, что на самом деле работал, но для сценария оболочки, который нужно запускать ежечасно, необходим доступ к двоичному файлу php, который выполняется в другом контейнере, так что это не жизнеспособное решение.

Если я шелл в контейнер и запускаю rc-service crond start Я получаю это - но оно никогда не "заканчивается":

/var/www/html # rc-service crond start
 * WARNING: crond is already starting
#> docker --version
Docker version 19.03.8, build afacb8b7f0
#> docker-compose --version
docker-compose version 1.23.2, build 1110ad01

Мне нужно решение, которое я могу поместить в мои Dockerfile или docker-compose.yml файлы.

Dockerd работает на Ubuntu Xenial FWIW.

1 Ответ

1 голос
/ 06 апреля 2020

для запуска контейнера cronjob (Alpine), вам нужно убедиться, что команда вашего docker контейнера -

exec crond -f

, если вы хотите добавить это в docker файл

CMD ["exec", "crond", "-f"]

Вам также может потребоваться обновить файлы кукурузы перед выполнением вышеуказанной команды

Обновление на основе файла docker и составление

Чтобы иметь возможность решить ваши проблемы, которые необходимо обновить для docker -композиции, чтобы иметь два контейнера, один для cron и один для веб

 service_php_cron:
    build:
      context: .
      dockerfile: .docker/services/php/Dockerfile.dev
    container_name: base_service_php
    command: 'cron_jobs'
    volumes:
      - ./app:/var/www/html/public
    env_file:
      - ./.env
    # Low level container logging
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "5"

  service_php:
    build:
      context: .
      dockerfile: .docker/services/php/Dockerfile.dev
    ports:
      - "9000:9000"
    command: 'web_server'
    container_name: base_service_php
    volumes:
      - ./app:/var/www/html/public
    env_file:
      - ./.env
    # Low level container logging
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "5"

, вам также необходимо обновить файл docker, чтобы иметь возможность обрабатывать несколько команд с помощью docker точки входа

Добавьте строку ниже в ваш docker файл + удалите CMD один

COPY ./docker-entrypoint.sh /
RUN chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

и, наконец, создайте точку входа (убедитесь, что она sh выполнена разрешения)

#!/bin/sh -e

case $1 in

  web_server)
    YOUR WEB SERVER COMMAND 
  ;;

  cron_jobs)
     exec crond -f
  ;;

  *)
    exec "$@"
  ;;

esac

exit 0

Вы можете проверить эту ссылку для получения дополнительной информации о entrypoints

...