J'ai besoin de combiner le php-fpm avec nginx dans un dockerfile pour le déploiement de la production.
Alors vaut-il mieux:
(1) Démarrez le dockerfile en utilisant php: 7.1.8-fpm puis installez la couche d'image nginx dessus?
(2) Ou recommandez-vous d'utiliser l'image nginx puis d'installer php-fpm en utilisant apt-get?
PS: je n'ai pas d'option de construction docker-compose pour le déploiement de la production. Sur mon environnement de développement, j'utilise déjà Docker-compose et je construis facilement une application multi-conteneurs à partir de deux images. Notre organisation devops ne prend pas en charge le déploiement basé sur docker-compose pour l'environnement prod.
L'installation de Nginx est beaucoup plus facile que PHP donc il devrait être plus facile pour vous d'installer Nginx dans l'image officielle prête à l'emploi PHP image. Voici l'exemple Dockerfile montrant comment votre objectif peut être atteint avec un exemple d'installation de quelques extensions PHP:
FROM php:7.2-fpm
RUN apt-get update -y \
&& apt-get install -y nginx
# PHP_CPPFLAGS are used by the docker-php-ext-* scripts
ENV PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++11"
RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-install opcache \
&& apt-get install libicu-dev -y \
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl \
&& apt-get remove libicu-dev icu-devtools -y
RUN { \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=2'; \
echo 'opcache.fast_shutdown=1'; \
echo 'opcache.enable_cli=1'; \
} > /usr/local/etc/php/conf.d/php-opocache-cfg.ini
COPY nginx-site.conf /etc/nginx/sites-enabled/default
COPY entrypoint.sh /etc/entrypoint.sh
COPY --chown=www-data:www-data . /var/www/mysite
WORKDIR /var/www/mysite
EXPOSE 80 443
ENTRYPOINT ["/etc/entrypoint.sh"]
Le nginx-site.conf
le fichier contient votre configuration d'hôte http nginx. L'exemple ci-dessous concerne l'application Symfony:
server {
root /var/www/mysite/web;
include /etc/nginx/default.d/*.conf;
index app.php index.php index.html index.htm;
client_max_body_size 30m;
location / {
try_files $uri $uri/ /app.php$is_args$args;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index app.php;
include fastcgi.conf;
}
}
Le entrypoint.sh
exécutera nginx et php-fpm au démarrage du conteneur (sinon, seul php-fpm sera démarré comme action par défaut de l'image officielle PHP):
#!/usr/bin/env bash
service nginx start
php-fpm
Bien sûr, ce n'est pas le meilleur moyen du point de vue des meilleures pratiques, mais j'espère que c'est la réponse à votre question.