Tengo un pequeño problema teórico con la combinación de php-fpm, nginx y el código de la aplicación en Docker.
Estoy tratando de apegarme al modelo cuando la imagen de la ventana acoplable solo hace una cosa -> Tengo contenedores separados para php-fpm y nginx.
php: image: php:5-fpm-alpine expose: - 9000:9000 volumes: - ./:/var/www/app nginx: image: nginx:alpine ports: - 3000:80 links: - php volumes: - ./nginx/app.conf:/etc/nginx/conf.d/app.conf - ./:/var/www/app NOTA: En app.conf es root /var/www/app; Esquema de ejemplo de Symfony
Esto es excelente en desarrollo, pero no sé cómo convertirlo en un estado listo para producción. Montar el directorio de la aplicación en producción es realmente una mala práctica (si no me equivoco). En el mejor de los casos, copio el código fuente de la aplicación en el contenedor y uso este código precompilado ( COPY . /var/www/app en Dockerfile ), pero en este caso es imposible o no sé cómo.
Necesito compartir el código fuente de la aplicación entre dos contenedores (contenedor nginx y contenedor php-fpm) porque la cabina lo necesita.
Por supuesto, puedo crear mi propio contenedor nginx y php-fpm y agregar COPY . /var/www/app en ambos, pero creo que está mal porque dupliqué el código y todo el proceso de compilación (instalar dependencias, compilar código fuente, etc.) debe estar en ambos (nginx/php-fpm ) contenedores.
Intento buscar pero no encuentro ninguna idea de cómo resolver este problema. Muchos artículos muestran cómo hacer esto con el archivo docker-compose y el código de montaje con --volume pero no encontré ningún ejemplo de cómo usar esto en producción (sin volumen).
Solo una solución aceptable para mí (en este momento) es hacer un contenedor con nginx y php-fpm juntos, pero no estoy seguro de cuándo es una buena manera ( trato de encontrar las mejores prácticas ).
¿Tienes alguna experiencia con esto o alguna idea de cómo resolverlo?
¡Gracias por cualquier respuesta!
Resuelvo el problema creando un volumen compartido con el archivo docker-compose:
version: '3' volumes: share_place: services: php: image: php:5-fpm-alpine ports: - 9000:9000 volumes: - share_place:/var/www/app nginx: image: nginx:alpine ports: - 3000:80 volumes: - share_place:/var/www/appEsto creará un volumen share_place que compartirá los datos entre los dos contenedores.
En este momento uso algo como:
archivo acoplable:
FROM php:fpm COPY . /var/www/app/ WORKDIR /var/www/app/ RUN composer install EXPOSE 9000 VOLUME /var/www/app/webDockerfile.nginx
FROM nginx COPY default /etc/nginx/defaultdocker-compose.yml
app: build: context: . web: build: context: . dockerfile: Dockerfile.nginx volumes_from: appPero en unos días en el lanzamiento de 17.05 podemos hacer en un Dockerfile algo como:
FROM php:cli AS builder COPY . /var/www/app/ WORKDIR /var/www/app/ RUN composer install && bin/console assets:dump FROM php:fpm AS app COPY --from=builder /var/www/app/src /var/www/app/vendor /var/www/app/ COPY --from=builder /var/www/app/web/app.php /var/www/app/vendo /var/www/app/web/ FROM nginx AS web COPY default /etc/nginx/default COPY --from=builder /var/www/app/web /var/www/app/web