Как исполнять скрипты при старте docker контейнера?

Здравствуйте!

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

И так, задача минимум - запустить apache при старте контейнера

Задача максимум - выполнить bash скрипт при старте контейнера

Я опишу варианты которые я пробовал.

1. Сборка простейшего образа и запуск контейнера из консоли

Dockerfile
FROM ubuntu:14.04

RUN apt-get update && \
    apt-get install -y apache2


В консоли:
sudo docker build -t apache .
sudo docker run -dit --name cont_apache apache /bin/bash service apache2 start


В ответ код контейнера, docker ps чист. docker logs cont_apache сообщает о запуске апача - Starting web server apache2 ...
Но сам контейнер почему-то умирает. хотя флаг -d установлен.

Попытался:
sudo docker run -dit --name cont_apache apache service apache2 start


Результат точно такой же.

2. Сборка образа и запуск апача при помощи CMD

Dockerfile:
FROM ubuntu:14.04

RUN apt-get update && \
    apt-get install -y apache2
	
CMD ["service" "apache2", "start"]


В консоли:
sudo docker build -t apache .
sudo docker run -dit --name cont_apache apache /bin/bash service apache2 start


Контейнер запущем, висит как демон, перехожу в контейнер:
root@2a97628fd78b:/# service apache2 status
* apache2 is not running
Апач не запустился.
Почему?

3. Сборка образа с проброской bash скрипта и его выполнение

Dockerfile:
FROM ubuntu:14.04

RUN apt-get update && \
    apt-get install -y apache2 

COPY ./apache2_start.sh /root/apache2_start.sh

CMD ["chmod", "777", "/root/apache2_start.sh"]

CMD ["/root/apache2_start.sh"]


Script apache2_start.sh:
#!/bin/bash

service apache2 start
echo "127.0.0.1"


В консоли:
sudo docker build -t apache .
sudo docker run -dit --name cont_apache apache


В docker ps контейнера нет. В логах docker logs cont_apache:
* Starting web server apache2                                                  AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
 * 
127.0.0.1


Пробовал также с запуском bash из консоли:

sudo docker run -dit --name cont_apache apache /bin/bash


В результате контейнер висит в docker ps. Docker logs conf_apache чист.

А в самом контейнере:
root@d2c9831773a9:/# service apache2 status
* apache2 is not running


Итог.

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

Очевидно, что я допускаю ошибки в работе с докером.

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

Конечно, эти примеры высосаны из пальца, и можно найти кучу примеров запуска окружения при помощи docker compose. Но моя цель разобраться в вопросе, и уже в дальнейшем использовать всякие крутые штуки вроде docker compose
  • Вопрос задан
  • 5264 просмотра
Решения вопроса 1
@instanti
Скорее всего проблемы связаны с тем, что во всех способах, которые Вы попробовали, apache запускается в фоновом процессе, который порождается из основного, после чего основной процесс завершает свою работу. C точки зрения докера контейнер при этом тоже завершает свою работу.

Чтобы этого не происходило, запускайте apache с ключом FOREGROUND, например:
CMD ["apache2", "-DFOREGROUND"]

Тут можно подробнее почитать почему так происходит, про философию докера и процессов внутри контейнера: https://blog.phusion.nl/2015/01/20/docker-and-the-...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы