好的,所以我根据需要设置了我的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并保持终端直播,这样我就可以在那里做事。
答案 0 :(得分:2)
容器是隔离正在运行的应用程序的工具,它们会一直运行,直到启动的应用程序退出。如果此应用程序是一个shell或命令,它在后台启动守护程序,就像您已经完成的那样,当shell或命令返回时,容器将立即退出。
解决方案是在前台运行您的应用程序。使用Apache执行此操作的步骤已经完成,我建议使用官方图像来构建自己的图像。你可以see their Dockerfile here。你可以use their image on Dockerfile。