#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, но тогда он должен быть последним, и вы не сможете сделать больше в скрипте. Более общий подход, когда вам нужно запустить больше процессов, заключается в том, чтобы запускать их в фоновом режиме, а затем ждать в скрипте.