Cómo actualizar la versión de php que tiene una imagen docker

¿Alguna vez te pasó algo como esto?

me he bajado una imagen que contiene wordpress con letsencrypt, pero la versión de php que utiliza es la 5.6 y necesito actualizarla a la 7.2.
¿Hay alguna forma de modificar esto desde dentro o desde fuera del contenedor?

Qué dilema, ¿no?

La primera pregunta que se me ocurre es ¿realmente te bajaste una imágen y no un Dockerfile?

Por un rato asumiré que así es… después lo volvemos a revisar.

Así que, teniendo esta imagen podés construir contenedores pero… ¿si hacés la actualización y el contenedor se destruye? ¡Olvidate de la actualización! No suena muy divertido, ¿no? ¿Y entonces? ¿¿No hay salida??

Bueno… no tan rápido.

Un comando de Docker no muy usado (ni muy comentado honestamente) es el comando commit el cual puede venir bastante bien en esta situación.

Este comando permite crear una imagen basada en el estado actual de un contenedor. Es decir, es una forma de crear una imagen sin tener un Dockerfile.

En este hipotético escenario se podría hacer algo del estilo:

docker run -it wordpress:php5.6 bash

Y, una vez dentro, realizar la actualización siguiendo algún tutorial como este por ejemplo.

El problema, o mejor dicho, el primero de los problemas, es que esta versión de php es tan vieja que las imágenes que la contienen suelen estar basadas en versiones igual de viejas el sistema operativo. Esto implica que los repositorios ya quedaron obsoletos… en fin, que hacer esta actualización será un viajecito en sí mismo (Sí, te lo digo por experiencia después de haber probado unas 10 imágenes tratando de armar un ejemplo para este post).

Pero bueno… supongamos que, de alguna forma, te las arreglaste para actualizar el php.

Mientras el contenedor no se elimine, podrás usar docker ps -a para obtener algo como:

Y, una vez obtenido el ID del contenedor:

docker commit 9d50869ba044 wordpress:php5.6.muc

Esto te creará una nueva imagen para usar en tu sistema con la cual podrás crear un nuevo contenedor, por ejemplo:

docker run -it wordpress:php5.6.muc bash

Y ahora sí, al hacer php -v encontrarás la versión de php que necesitabas.

¡Genial! ¿No? Bueno… no exactamente.

Para empezar, la nueva versión de php no necesariamente será compatible con tu versión de WordPress… es más, lo más probable es que ese no sea el caso.

Aún si lo fuera… ¿vale la pena ponerse a actualizar la versión de PHP? La verdad es que lo veo bastante poco práctico.

Precisamente, la idea de usar Docker es crear contenedores desechables. ¿Quedó desactualizada la versión de php? Ningún problema, armemos una nueva imagen con la versión que se se requiere y listo.

De hecho, lo más probable es que lo que hayas descargado sea un Dockerfile más que una mera imagen.

Si ese es el caso, podrías hacer algo tan sencillo como modificar la imagen usada como base y re-construir la imagen.

Es decir, si el Dockerfile se ve algo así como:

 # Base image
FROM php:5.6-apache

# Install the mysqli extension
RUN docker-php-ext-install mysqli

# Update repo
RUN apt-get update -y

# Install mysql-client
RUN apt-get install mysql-client -y

# Install wp-cli as wp
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar  && \
  chmod +x wp-cli.phar && \
  mv wp-cli.phar /usr/local/bin/wp

# Download and extract WordPress files on /var/www/html
RUN wp core download --allow-root

# Get args from docker-composer.yml
ARG WORDPRESS_DB_NAME
ARG WORDPRESS_DB_USER
ARG WORDPRESS_DB_PASSWORD
ARG WORDPRESS_DB_HOST

# Creating wp-config.php file on /var/www/html
RUN wp config create --dbname=${WORDPRESS_DB_NAME} --dbuser=${WORDPRESS_DB_USER} --dbpass=${WORDPRESS_DB_PASSWORD} --dbhost=${WORDPRESS_DB_HOST} --allow-root --skip-check

COPY entrypoint.sh /entrypoint.sh

# makes the script executable
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

CMD ["apache2-foreground"]

Podrías cambiarlo por

 # Base image
FROM php:7.2-apache

# Install the mysqli extension
RUN docker-php-ext-install mysqli

# Update repo
RUN apt-get update -y

# Install mysql-client
RUN apt-get install mysql-client -y

# Install wp-cli as wp
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar  && \
  chmod +x wp-cli.phar && \
  mv wp-cli.phar /usr/local/bin/wp

# Download and extract WordPress files on /var/www/html
RUN wp core download --allow-root

# Get args from docker-composer.yml
ARG WORDPRESS_DB_NAME
ARG WORDPRESS_DB_USER
ARG WORDPRESS_DB_PASSWORD
ARG WORDPRESS_DB_HOST

# Creating wp-config.php file on /var/www/html
RUN wp config create --dbname=${WORDPRESS_DB_NAME} --dbuser=${WORDPRESS_DB_USER} --dbpass=${WORDPRESS_DB_PASSWORD} --dbhost=${WORDPRESS_DB_HOST} --allow-root --skip-check

COPY entrypoint.sh /entrypoint.sh

# makes the script executable
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

CMD ["apache2-foreground"]

Y ejecutar nuevamente docker build.

Ojo: ¡Esto no resuelve el problema de la incompatibilidad de la versión de PHP y de WordPress! Pero al menos te ahorra unos cuantos dolores de cabeza tratando de hacer la migración.

Mi consejo al final sería pasar todos los datos a volúmenes, buscar una imagen que tenga las versiones del software que querés usar y con esa imagen crear un nuevo contenedor donde montarlos.

Probablemente eso sea mucho más sencillo y eficiente.

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.