在 Docker 上重新启动 apache


Restart apache on Docker

我正在尝试更新Docker容器上的.htaccess文件。 更新文件后,我需要重新启动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即可应用.htaccess中定义的更改 - 这些更改在运行时应用。如果您正在修改 apache 配置文件(如虚拟主机定义或 httpd.conf 中的某些内容),您还可以使用

sudo /etc/init.d/apache2 reload

这是因为当您docker run容器时,您(正确地)没有将 apache 作为服务启动。该行:

CMD ["/usr/sbin/apache2", "-D",  "FOREGROUND"]

前台启动 apache。

我猜您正在使用docker exec在容器中执行 shell 以编辑文件并重新启动 apache?如果是这样,这可以解释为什么第二次启动 apache 时它会抱怨现有进程。

我认为,如果您以这种方式使用容器,那么您真的错过了容器的好处,当您将它们视为不可变并将数据保存在容器之外(在您的主机上或卷中)以便您可以轻松替换容器时。

在您的情况下,如果您需要修改 .htaccess 文件,我认为使用以下命令将该文件挂载到容器中会更正常:

docker run -d --name apache -v $(pwd)/.htaccess:/path/to/.htaccess -p 80:80 image:tag

然后,如果您必须更改文件并需要重新启动 apache,您可以使用:

docker restart apache

尽管可能值得调查夏洛特·杜努瓦的建议,即您甚至可能不需要重新启动 apache。