¿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.