Запуск nginx на Alpine - PullRequest
       32

Запуск nginx на Alpine

2 голосов
/ 09 июля 2019

Я хотел бы запустить nginx и php-fpm при запуске контейнера, однако я не могу этого сделать. Вот мой Dockerfile:

FROM php:7-fpm-alpine

EXPOSE 9080 8000
EXPOSE 9088 80

WORKDIR /var/www
COPY . .

RUN apk add nginx composer php7-fpm && \
    composer install --no-progress && \
    mkdir -p /etc/nginx /etc/nginx/sites-available /etc/nginx/sites-enabled /run/nginx && \
    ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
    cp nginx.conf /etc/nginx/conf.d/default.conf

CMD ["nginx", "-g", "daemon off;"]

Контейнер запускается и работает, однако, когда я запускаю ps aux nginx нигде не видно, пока я не выполню команду nginx (конфигурация в порядке, nginx -t возвращается нормально, и запуск его через открытый контейнер действительно запускает службу ).

Я пытался связать RUN php-fpm7 && nginx, но это ничего не делает.

Также использование точки входа типа ENTRYPOINT ["nginx"] ничего не сделало для меня.

Как я могу убедиться, что эти процессы выполняются при создании контейнера?

Ответы [ 3 ]

3 голосов
/ 09 июля 2019

запуск 2 процессов в одном и том же контейнере не является лучшей практикой докера, но я предполагаю, что это правильный подход для вашего конкретного варианта использования.К счастью, у докера есть решение для вас. :

используйте инструмент управления - supervisord .

supervisord предназначен дляуправление несколькими процессами, и я считаю, что это лучше, чем сценарий оболочки, потому что он предлагает вам возможности управления и ведения журналов.создайте supervisord.conf:

[supervisord]
nodaemon=true
logfile=/tmp/supervisord.log
childlogdir=/tmp
pidfile = /tmp/supervisord.pid

[program:php-fpm]
command=php-fpm7 -F
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=false
startretries=0

[program:nginx]
command=nginx -g 'daemon off;'
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=false
startretries=0

, затем установите и скопируйте его в Dockerfile:

RUN apk add supervisor
COPY ./supervisord.conf /etc/

Теперь ваша точка входа должна быть:

ENTRYPOINT /usr/bin/supervisord -c /etc/supervisord.conf
2 голосов
/ 09 июля 2019

вы можете добавить скрипт и использовать его в вашем CMD:

скрипт:

#!/bin/bash
service nginx start
php-fpm7

добавить скрипт к вашему Dockerfile:

COPY /PATH/TO/script.sh /path/in/container/script.sh
RUN chmod +x /path/in/container/script.sh
CMD ["/path/in/container/script.sh"]
0 голосов
/ 09 июля 2019

Оба ответа великолепны, но, как упомянуто @Efrat supervisorsd, больше подходит для таких случаев.

Одна вещь, которую я ненавижу при копировании во время процесса сборки Docker, Dockerfile должен быть независимым для копирования того, что я считаю,Это должен быть только Dockerfile, который будет создавать образ Docker, а не другие вещи, которые они должны быть скопированы.Просто расширяю ответ @Efrat.Здесь вы идете со всей конфигурацией внутри Dockerfile.

FROM php:7-fpm-alpine
WORKDIR /var/www
RUN apk add nginx composer php7-fpm supervisor && \
    mkdir -p /etc/nginx /etc/nginx/sites-available /etc/nginx/sites-enabled /run/nginx && \
    ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
    # cp nginx.conf /etc/nginx/conf.d/default.conf && \
    mkdir -p /etc/supervisord.d/

#supervisord basic config file    
    RUN echo  $'[supervisord] \n\
[unix_http_server] \n\
file = /tmp/supervisor.sock \n\
chmod = 0777 \n\
chown= nobody:nogroup \n\
[supervisord] \n\
logfile = /tmp/supervisord.log \n\
logfile_maxbytes = 50MB \n\
logfile_backups=10 \n\
loglevel = info \n\ 
pidfile = /tmp/supervisord.pid \n\
nodaemon = true \n\
umask = 022 \n\
identifier = supervisor \n\
[supervisorctl] \n\
serverurl = unix:///tmp/supervisor.sock \n\
[rpcinterface:supervisor] \n\
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface \n\
[include] \n\
files = /etc/supervisord.d/*.conf' >> /etc/supervisord.conf 

# nginx supervisord Config
    RUN echo $'[supervisord] \n\
nodaemon=true \n\
[program:nginx] \n\
command= /usr/sbin/nginx -g \'daemon off;\' \n\
stdout_logfile=/dev/fd/1 \n\
stdout_logfile_maxbytes=0MB \n\
stderr_logfile_maxbytes = 0 \n\
stderr_logfile=/dev/fd/2 \n\
redirect_stderr=true \n\
autorestart=false \n\
startretries=0 \n\
exitcodes=0 ' >> /etc/supervisord.d/nginx.conf
# php-fpm7
RUN echo $'[supervisord] \n\
nodaemon=true \n\
[program:php-fpm] \n\
command= /usr/sbin/php-fpm7  -F \n\
stdout_logfile=/dev/fd/1 \n\
stdout_logfile_maxbytes=0MB \n\
stderr_logfile_maxbytes = 0 \n\
stderr_logfile=/dev/fd/2 \n\
redirect_stderr=true \n\
autorestart=false \n\
startretries=0 \n\
exitcodes=0 ' >> /etc/supervisord.d/php-fpm.conf

EXPOSE 9080 8000 9088 80

ENTRYPOINT ["supervisord", "--nodaemon", "--configuration", "/etc/supervisord.conf"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...