2016-04-26 144 views
3

我正在嘗試更新Docker容器上的.htaccess文件。更新文件後,我需要重新啓動Apache。每當我試圖重新啓動Apache:使用命令service apache2 restart我收到以下錯誤:在Docker上重新啓動Apache

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable to open logs Action 'start' failed. The Apache error log may have more information. ...fail!

當我到了錯誤日誌它沒有任何新的錯誤。 這是我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"] 
+0

如果你改變'.htaccess',你不需要重新啓動Apache ...也許你應該看看是否有任何其他程序在端口80上偵聽。此外這個問題是堆棧溢出的話題,因爲它沒有任何東西與編程有關。 [超級用戶](http://superuser.com)是合適的平臺(不要跨站點)。 –

回答

2

這是因爲你(正確地)未啓動Apache作爲一種服務,當您docker run容器。該行:

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

在前臺啓動apache。

我猜你正在使用docker exec在容器中執行一個shell來編輯文件並重新啓動apache?如果是這樣,這將解釋爲什麼第二次啓動apache它抱怨現有的過程。

我認爲如果你以這種方式使用容器,那麼你真的錯過了容器的好處,當你將它們視爲不可變的並將容器保存在容器之外(在主機或容器中)時您可以輕鬆更換容器。

在你的情況,如果你需要修改.htaccess文件,我認爲這將是比較正常的,通過使用這樣的命令來安裝該文件到container:

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

然後,如果你必須改變文件,並需要重新啓動Apache你可以使用:

docker restart apache 

雖然它可能是值得研究的夏洛特杜諾瓦的建議,你甚至不需要重新啓動Apache。