Tengo un contenedor docker php que ejecuta mi aplicación y necesito comenzar a usar Composer para instalar un paquete php. ¿Cuál es la mejor manera de abordarlo?
Los archivos fuente se pueden encontrar aquí:
https://github.com/ikknd/docker-study en la carpeta receta-05
1. No es el mejor enfoque, pero sí el más sencillo: no usar la imagen "php:7.2-fpm", sino crear una imagen personalizada con php y composer.
Técnicamente, esto funciona, instalo Composer en mi imagen php, y cada vez que necesito actualizar o instalar dependencias, simplemente ejecuto llamadas en mi contenedor php personalizado.
Problemas:
- necesita usar el compositor en varios contenedores diferentes: da como resultado imágenes personalizadas para cada contenedor, donde se necesita el compositor
- si ejecuto la ventana acoplable en modo de enjambre y escalo el contenedor a más de 1 copia, da como resultado que cada contenedor ejecute "instalación del compositor"
2. Un enfoque mucho mejor: usar una imagen acoplable de compositor dedicada, mapear mi proyecto dentro y ejecutar comandos de compositor.
Usaré ideas de la receta 02 - página php simple y receta 04 - configuración de redis .
Cree el archivo docker-compose.yml en la carpeta "docker":
Aquí hago varias cosas:
- /var/www/docker-study.loc/recipe-05/php:/app - la imagen del compositor por defecto ejecuta comandos desde la carpeta /app, es por eso que mapeo un proyecto como este
- Mapeo /var/www/docker-study.loc/recipe-05/php tanto para el contenedor php como para el contenedor composer, de esta manera el contenedor composer puede ejecutar "composer install", y el contenedor php tendrá el código actualizado
- "depends_on": evita que el contenedor comience antes que otro contenedor, del cual depende
3. Cree composer.json en la carpeta "php":
4. Cree index.php en la carpeta "php":
El objetivo aquí es usar la biblioteca del compositor - "predis/predis" (solo como ejemplo). Esta biblioteca debe instalarse una vez que se inicia el contenedor "compositor".
Puedo ir a /var/www/docker-study.loc/recipe-05/docker/ y ejecutar:
docker-compose up -d
Ahora vaya a myapp.loc/ y vea "¡funciona!"
5. Pensamientos finales.
Cuando se inició el contenedor del compositor, ejecutó el comando "instalar compositor" y luego salió. Puedo confirmar esto ejecutando: "docker container ls -a" - esto mostrará que el contenedor "docker_composer_1" ha salido.
Si lo hago, "docker logs docker_composer_1" , puedo ver información sobre lo que sucedió cuando se inició el contenedor y cómo fue el proceso de "instalación del compositor".
¿Qué sucede si cambio el archivo composer.json y necesito instalar una biblioteca adicional?
docker-compose restart composer
Esto iniciará este contenedor nuevamente, ejecutará la instalación y saldrá.
¿Qué sucede si necesito ejecutar "actualización del compositor" en lugar de "instalación del compositor" ?
Puedo cambiar "instalar" -> "actualizar" en docker-compose.yml y ejecutar "docker-compose restart composer"