Docker容器在启动Apache后关闭

时间:2018-05-20 10:49:26

标签: apache ubuntu docker dockerfile

好的,所以我根据需要设置了我的docker容器。

这是我当前的 Dockerfile

FROM ubuntu:16.04

RUN apt-get update
RUN apt-get upgrade -y

RUN apt-get install -y \
    build-essential sudo software-properties-common \
    libboost-dev libboost-filesystem-dev libboost-program-options-dev \
    libboost-regex-dev libboost-system-dev libboost-thread-dev \
    libicu-dev libtiff5-dev libfreetype6-dev libpng12-dev \
    libxml2-dev libproj-dev libsqlite3-dev libgdal-dev \
    libcairo-dev libharfbuzz-dev

RUN apt-get install -y postgresql postgresql-contrib

RUN apt-get install -y nodejs 

RUN apt-get install -y python3-dev python-dev git python-pip \
    python-setuptools python-wheel python3-setuptools \
    python3-pip python3-wheel python-cairo-dev libboost-python-dev

RUN apt-get install -y ruby ruby-dev

RUN apt-get install -y wget curl 

RUN pip install --upgrade pip
RUN pip install mapnik

RUN sudo gem install awesome_print colorize twitter_cldr \
    nokogiri unidecoder

RUN apt-get -y install apache2 php-pear lynx-cur

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80

ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf

如果我构建它并使用docker run -p 80:80 -it mycontainer运行它,它运行正常。我可以通过终端,执行/usr/bin/apache2ctl start,服务器像往常一样启动,我可以从主机的浏览器通过 localhost 访问它。太好了!

现在,我的想法是简单地将/usr/bin/apache2ctl start命令放在我的 Dockerfile 中,这样我就不必在每次容器启动时都写它。

但是:如果我将CMD ["/usr/sbin/apache2ctl", "start"]放在我的 Dockerfile 的最后,构建并运行它(使用docker run -p 80:80 -it mycontainer),容器似乎启动,输出Apache消息然后它停止,没有终端,没有。 (它也不在后台运行)。

发生了什么?我只是希望能够自动启动Apache并保持终端直播,这样我就可以在那里做事。

1 个答案:

答案 0 :(得分:2)

容器是隔离正在运行的应用程序的工具,它们会一直运行,直到启动的应用程序退出。如果此应用程序是一个shell或命令,它在后台启动守护程序,就像您已经完成的那样,当shell或命令返回时,容器将立即退出。

解决方案是在前台运行您的应用程序。使用Apache执行此操作的步骤已经完成,我建议使用官方图像来构建自己的图像。你可以see their Dockerfile here。你可以use their image on Dockerfile