Я пытаюсь обновить мой файл .htaccess в контейнере Docker. После обновления файла мне нужно перезапустить Apache. Всякий раз, когда я пытаюсь перезапустить Apache: с помощью команды service apache2 restart
Я получаю следующую ошибку:
(98) Адрес уже используется: make_sock: невозможно привязать к адресу 0.0.0.0:80
нет доступных гнезд для прослушивания, отключение
Невозможно открыть логи
Действие «старт» не выполнено.
Журнал ошибок Apache может содержать больше информации.
…потерпеть поражение!
Когда я попал в журнал ошибок, там нет новых ошибок.
Вот как выглядит мой Dockerfile:
FROM ubuntu:12.04
# Install dependencies
RUN apt-get update -y
RUN apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql php5-curl vim
# Install app
RUN rm -rf /var/www/ *
ADD src /var/www
# Configure apache
RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
Это потому, что вы (правильно) не запускаете Apache как сервис, когда вы docker run
контейнер. Линия:
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
Запускает Apache на переднем плане.
Я предполагаю, что вы тогда используете docker exec
выполнить оболочку в контейнере, отредактировать файл и перезапустить apache? Если это так, это объясняет, почему при втором запуске apache он жалуется на существующий процесс.
Я думаю, что если вы используете контейнеры таким образом, то вы действительно упускаете преимущество контейнеров, которое возникает, когда вы рассматриваете их как неизменяемые и сохраняете данные вне контейнера (на хосте или в томах), чтобы вы могли легко заменить контейнер.
В вашем случае, если вам нужно изменить файл .htaccess, я думаю, что было бы более нормальным монтировать этот файл в контейнер с помощью такой команды:
docker run -d --name apache -v $(pwd)/.htaccess:/path/to/.htaccess -p 80:80 image:tag
Затем, если вам нужно изменить файл и перезапустить apache, вы можете использовать:
docker restart apache
Хотя, возможно, стоит рассмотреть предложение Шарлотты Дюнуа о том, что вам может даже не понадобиться перезапускать Apache.
На самом деле вам не нужно перезапускать Apache, чтобы применить изменения, определенные в .htaccess — они применяются во время выполнения. Если вы изменяете конфигурационный файл apache (например, определение виртуального хоста или что-то в httpd.conf), вы также можете перезагрузить конфигурацию без перезапуска apache, используя
sudo /etc/init.d/apache2 reload