Как мне запустить php-fpm при запуске контейнера docker?

#php #docker #nginx

#php #docker #nginx

Вопрос:

Как я могу автоматически запускать php-fpm команду при запуске контейнера docker?

У меня есть этот файл Dockerfile:

 FROM composer:1.6.5 as build
WORKDIR /var/www
COPY . /var/www
RUN composer install

FROM php:7.2-fpm
USER root
RUN apt-get update amp;amp; apt-get install -y 
    build-essential 
    mysql-client 
    libpng-dev 
    libjpeg62-turbo-dev 
    libfreetype6-dev 
    locales 
    zip 
    jpegoptim optipng pngquant gifsicle 
    vim 
    unzip 
    git 
    curl
RUN apt-get clean amp;amp; rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd
RUN apt-get update -y 
    amp;amp; apt-get install -y nginx
RUN rm -rf /var/www/html
COPY --chown=www-data:www-data --from=build /var/www /var/www
COPY nginx.conf /etc/nginx/sites-enabled/default
EXPOSE 80

RUN service nginx restart
CMD ["nginx", "-g", "daemon off;"]
  

Я знаю, что должен запустить php-fpm , потому что, когда я обращаюсь к 127.0.0.1: 8080, он не показывает мою веб-страницу. Но когда я подключаюсь к контейнеру по ssh и запускаю php-fpm , затем снова посещаю 127.0.0.1: 8080, он покажет веб-страницу.

Должен ли я добавить CMD ["php-fpm"] ниже? Нормально ли иметь два CMD файла Dockerfile?

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

1. Вы должны запускать php-fpm и nginx в отдельных контейнерах. Контейнер запускает только один основной процесс; подключить два может быть сложно, и обычно это не рекомендуемая настройка.

2. Да, я знаю, но в этом случае php-fpm и nginx находятся в одном контейнере. Как мне выполнить php-fpm команду при запуске контейнера.

Ответ №1:

Это предполагает, что вы создаете start_service.sh скрипт или что-то еще. чтобы запустить как php_fpm, так и nginx при запуске контейнера.

Если скрипт подходит для обоих процессов в качестве демонов или в фоновом режиме. А затем просто ждать вечно.

 #!/bin/bash
"start php_fpm"
"start_iginx"
sleep infinite
  

В CMD в Dockerfile вы просто вызываете свой скрипт вместо nginx.

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

1. почему вы поставили sleep infinite ?

2. Скрипт будет выполняться как основной процесс для контейнера, при запуске скрипта он запустит php_fpm и продолжит работу, затем запустит nginx и продолжит работу, оба в фоновом режиме. Если вы не перейдете в режим ожидания, контейнер завершит работу. Вы также можете выбрать запуск nginx в fourground, но тогда он должен быть последним, и вы не сможете сделать больше в скрипте. Более общий подход, когда вам нужно запустить больше процессов, заключается в том, чтобы запускать их в фоновом режиме, а затем ждать в скрипте.