Как задать правильный ПУТЬ для apache2ctl в sh-среде Docker

#docker #apache2

#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 amp;amp; apt-get update amp;amp; apt-get -y -q upgrade amp;amp; apt-get -y -q install apache2
RUN  apt-get update amp;amp; apt-get -y -q upgrade amp;amp; apt-get -y -q install apache2

EXPOSE 80 443

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

Когда я запускаю свой контейнер, система вызывает 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 amp;' failed.
    The Apache error log may have more information.
  

Когда я запустил свой Dockerfile как контейнер без CMD строки в интерактивном режиме, я смог запустить apache2ctl -D FOREGROUND amp; и у меня заработала страница Apache по умолчанию.

Обновить

Когда я создавал свой Dockefile с CMD следующей строкой :

 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:

Удалите последний "amp;" аргумент из вашего CMD .

Здесь есть две основные проблемы, и удаление amp; устраняет обе:

Когда вы используете CMD ["command", "arg", "..."] форму, Docker вообще не запускает оболочку; он просто напрямую запускает команду и передает заданные аргументы. Ваш CMD выполняется apache2ctl с тремя аргументами, -D , FOREGROUND и amp; . apache2ctl запускается apache2 с заданными аргументами, но не воспринимается amp; как аргумент, что и является ошибкой, которую вы получаете.

Кроме того, ваш CMD (или ENTRYPOINT ) должен запускать свой процесс как процесс переднего плана. Если вы введете команду в своей командной строке и сразу же получите обратно приглашение командной строки, если вы попытаетесь сделать эту команду основной командой в контейнере, контейнер немедленно завершит работу при его запуске. Вы не хотите, чтобы здесь amp; подразумевалась обычная оболочка «запуск в фоновом режиме»; вы хотите, чтобы Apache запускался как процесс переднего плана, а контейнер выполнялся до тех пор, пока работает Apache.

Комментарии:

1. Я сделал обновление, я думаю, что я недостаточно хорошо объяснил проблему

2. service по сути, не работает в Docker по той же причине, что и в моем последнем абзаце. Интересно, нужен ли вам -DFOREGROUND в качестве единственного аргумента.