Cómo agregar extensiones PHP a una imagen Docker

¿Tu aplicación necesita generar algún gráfico usando GD? ¿O tal vez algo más común como parsear un XML?

Muchas de las funciones de bajo nivel de php están disponibles a través de extensiones que probablemente no se encuentren instaladas en tu imagen base.

¿Qué puedes hacer?

Las opciones son varias:

  1. Buscar una nueva imagen base que sí las tenga instaladas
  2. Descargar el código fuente, compilar e instalar manualmente las extensiones
  3. Usar el script que viene con las imágenes oficiales de php

Supongo que la elección es clara, ¿no?

Cómo usar docker-php-ext-install

En general, si usás una imagen basada en alguna de las imágenes oficiales de php, vas a tener acceso a este simpático script.

Para usarlo basta con invocarlo de esta forma:

docker-php-ext-install <EXTENSION>

Por ejemplo, para instalar la extensión zip se puede usar:

docker-php-ext-install zip

Es probable que, en algunas imágenes, esto genere un error debido a la falta de las librerías de base requeridas, en el caso de zip se trata de libzip-dev.

Para resolver este problema se requiere, previa a la invocación del script docker-php-ext-install, realizar la instalación correspondiente, por ejemplo usando:

apt install -y libzip-dev

Claro que, si esto se hace dentro de un contenedor en ejecución este cambio será efímero, es decir, si el contendor se destruye habrá que repetir todo el proceso.

Cómo persistir el cambio en la imagen

Lo mejor, si se pretende que el cambio persista más allá de la vida del contenedor en particular, es realizar estos cambios en el Dockerfile.

Algo así como:

FROM php:7.4.33-apache

LABEL authors="Mauro Chojrin <mauro.chojrin@leewayweb.com>"

RUN apt update && \
    apt install -y libzip-dev && \
    docker-php-ext-install zip

De esta forma, al realizar un build, la imagen resultante incluirá la extensión que se requiere y, por lo tanto, cualquier contenedor que la utilice también la tendrá disponible.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.