Задать вопрос
@timureh

Docker контейнер останавливается после запуска?

Имеется контейнер с БД mysql server и контейнер с вебсервером.
Если после запуска наполнить базу данных вручную (зайти в контейнер и дать команду), то все работает.
А если же команду наполнения базы добавить в Dockerfile контейнера с вебсервером, то он после исполнения команды останавливается (будь то CMD или ENTRYPOINT). Если в docker-compose.yml добавить restart: always, то контейнер уходит в бесконечный ребут. Dockerfile выглядит следующим образом:

FROM php:7.0-apache

RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y git zlib1g-dev libicu-dev mc mysql-client \
&& docker-php-ext-install zip pdo_mysql intl \
&& a2enmod rewrite \
&& sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/000-default.conf \
&& mv /var/www/html /var/www/public \
&& curl -sS https://getcomposer.org/installer \
| php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www
ENTRYPOINT ["./vendor/bin/doctrine-module", "migrations:migrate"]

Если команду выполнять на этапе RUN, то судя по всему файлы с проектом еще не примонтированы так как билд падает в ошибку: /bin/sh: 1: ./vendor/bin/doctrine-module: not found

Как исполнить команду чтобы контейнер "не упал"?
  • Вопрос задан
  • 8706 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@RidgeA
Он не падает - он работает как и должен: останавливается после выполнения команды.
Если потом надо в нем запустить веб-сервер то сделать можно как-то так

CMD ./vendor/bin/doctrine-module migrations:migrate && <some_command_to_start_server>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Сделайте для выполнения миграций отдельный контейнер с тем же образом, в docker-compose напишите ему эту команду. Тогда при старте контейнер с миграциями поднимется, сделает миграции и умрет, а основной контейнер с сервисом так и будет крутиться.
Ответ написан
Комментировать
@timureh Автор вопроса
RidgeA Вы правы! Спасибо.
Окончательно строчка выглядит так:

CMD ping mysql -c40 && ./vendor/bin/doctrine-module migrations:migrate && apache2-foreground

сначала приходится около 40 секунд пинговать контейнер с базой, ибо он инициализируется.
читал что можно сделать скриптами вида wait-for-it.sh, но по сути это тот же пинг.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы