如何在Docker的sh环境中设置apache2ctl的良好路径

时间:2019-03-11 19:17:00

标签: docker apache2

这是我的Dockerfile:

FROM debian

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

#RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get -y -q upgrade && apt-get -y -q install apache2
RUN  apt-get update && apt-get -y -q upgrade && apt-get -y -q install apache2

EXPOSE 80 443

CMD  ["/usr/sbin/apache2ctl","-D","FOREGROUND","&"]

启动容器时,系统正在调用apache2代替apache2ctl,并且出现了此错误消息:

:~/strech_apache$ docker container run -ti -p 80:80 system/strech_apache
Usage: /usr/sbin/apache2 [-D name] [-d directory] [-f file]
                         [-C "directive"] [-c "directive"]
                         [-k start|restart|graceful|graceful-stop|stop]
                         [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
.../...
    Action '-D FOREGROUND &' failed.
    The Apache error log may have more information.

当我以交互模式在没有CMD行的情况下将Dockerfile作为容器运行时,我能够启动apache2ctl -D FOREGROUND &,并且默认的apache页面正在运行。

更新

当我使用CMD行执行Dockefile时,如下所示:

CMD ["apache2ctl","-D","FOREGROUND"]

我的错误消息更改如下:

system@vmdebian:~/strech_apache$ docker container run -ti -p 80:80 system/strech_apache:strech
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
system@vmdebian:~/strech_apache$ 

就像我这样写我的CMD一样:

CMD  ["service","apache2","restart"]

我收到此消息

system@vmdebian:~/strech_apache$ docker container run -ti -p 80:80 system/strech_apache:strech 
[....] Restarting Apache httpd web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
. ok 

就像apache开关一样,容器在apache2停止的情况下就停止了

如何使apache2仍然运行?

1 个答案:

答案 0 :(得分:0)

从您的"&"中删除最后一个CMD参数。

这里存在两个潜在的问题,删除&可以同时解决这两个问题:

使用CMD ["command", "arg", "..."]表单时,Docker完全不运行shell;它只是直接运行命令并传递给定的参数。您的CMD使用三个自变量apache2ctl-DFOREGROUND运行&apache2ctl使用给定的参数启动apache2,但是它不理解&作为参数,这是您遇到的错误。

此外,您的CMD(或ENTRYPOINT)必须将其进程作为前台进程运行。如果在shell上键入命令并立即返回shell提示,如果尝试将该命令作为容器中的main命令,则启动该容器后,该容器将立即退出。您不希望此处&的常规shell在后台运行。您希望Apache作为前台进程运行,并且希望容器在Apache运行的同时运行。