Запуск apache и cron в докере - PullRequest
0 голосов
/ 04 марта 2019

Я понял, что должен быть только один процесс, выполняющийся на переднем плане в контейнере докера.Есть ли шанс запустить Apache и Cron вместе на переднем плане?Быстрый поиск говорит, что для этого есть нечто, называемое супервизором.Но есть ли другой метод, использующий скрипт Entrypoint или CMD?

Вот мой Dockerfile

FROM alpine:edge
RUN  apk update && apk upgrade
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk   /repositories
RUN  apk add \
     bash \ 
     apache2 \
     php7-apache2 \
     php7 \
     curl \
     php7-mysqli \
     php7-pdo \
     php7-pdo_mysql

 RUN cp /usr/bin/php7 /usr/bin/php
 RUN mkdir /startup
 COPY script.sh /startup
 RUN chmod 755 /startup/script.sh
 ENTRYPOINT ["/startup/script.sh"]

Содержимое файла script.sh вставляется ниже

#!/bin/bash
# start cron
/usr/sbin/crond -f -l 8
# start apache
httpd -D FOREGROUND

КогдаДокер запускается с этим образом, только crond работает, и что самое интересное, когда я убиваю cron, тогда apache запускается и работает на переднем плане.

Я использую aws ecs ec2 для запуска контейнера Docker, используя определение задачи и службу.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Контейнер Docker работает во время работы основного процесса внутри него.Поэтому, если вы хотите запустить две службы внутри докер-контейнера, один из них должен быть запущен в фоновом режиме.

Я предлагаю вообще избавиться от scrip.sh и заменить его только одним CMDслой:

CMD ( crond -f -l 8 & ) && httpd -D FOREGROUND

Финал Dockerfile это:

FROM alpine:edge
RUN  apk update && apk upgrade
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN  apk add \
     bash \ 
     apache2 \
     php7-apache2 \
     php7 \
     curl \
     php7-mysqli \
     php7-pdo \
     php7-pdo_mysql

RUN cp /usr/bin/php7 /usr/bin/php
CMD ( crond -f -l 8 & ) && httpd -D FOREGROUND
0 голосов
/ 04 марта 2019

Проблема в том, что вы запускаете crond -f, не говоря bash о его запуске в фоновом режиме, в основном заставляя bash ждать выхода crond, чтобы продолжить выполнение сценария.Для этого есть два решения:

  1. Удалите флаг -f (этот флаг вызывает запуск crond на переднем плане).
  2. Добавьте & в конце строки crond после -l 8 (я бы не рекомендовал это).

Кроме того, я бы запустил apache с exec:

exec httpd -D FOREGROUND

В противном случае /startup/script.sh останется запущенным,в то время как он больше не делает ничего полезного.exec говорит bash заменить текущий процесс командой для выполнения.

...