Cómo crear un servicio MySQL con Docker. Parte 2.

En la entrada anterior, vimos cómo crear un contenedor docker con MySQL y cómo crear volúmenes. Esta opción está bien para saber cómo funciona y probar a levantar un contenedor docker con MySQL. Sin embargo, no es la opción más cómoda, ya que tendríamos que estar siempre indicando la misma configuración, con todos los parámetros que necesitemos, etc. Lo ideal es tener un fichero Dockerfile con la configuración que vayamos a usar y crearnos nuestra propia imagen.

Algo que no hemos visto aún es cómo inicializar nuestra base de datos con todas las tablas que necesitamos, usuarios, etc. a la hora de crear nuestro contenedor.

En la documentación de la página de los contenedores oficiales de MySQL podemos ver todas las opciones que tenemos: https://hub.docker.com/_/mysql.

El ENTRYPOINT de las imágenes MySQL es el script entrypoint.sh. Este script, la primera vez que se ejecuta crea una base de datos con el nombre dado y comprueba si hay ficheros con extensiones .sh, .sql o .sql.gz en la carpeta /docker-entrypoint-initdb.d/. En caso de que los haya, los ejecuta por orden alfabético. De esta forma, podemos crear nuestra base de datos al ejecutar por primera vez nuestro contenedor copiando los scripts necesarios en dicha carpeta.

En nuestro pequeño proyecto Spring Boot creamos una serie par de tablas para las cuentas de usuario y sus roles (https://github.com/secdevoops/springboot-basic). Podemos copiar dicho script a un fichero .sql y subirlo a nuestro contenedor para que se creen nuestras tablas.

Veamos cómo quedaría nuestro fichero Dockerfile:

FROM mysql
ENV MYSQL_ROOT_PASSWORD=password
ENV MYSQL_DATABASE=myapp
VOLUME /var/lib/mysql
COPY init_script.sql docker-entrypoint-initdb.d/

Lo primero indicamos la imagen base mysql. Después indicamos las variables de entorno. Ya vimos la variable MYSQL_ROOT_PASSWORD que servia para indicar la contraseña del usuario root. Además, hemos añadido la variable de entorno MYSQL_DATABASE, que nos va a crear una nueva base de datos con el nombre indicado al inicializar. También indicamos el punto de montaje del volumen (recordemos que mysql almacena los datos en /var/lib/mysql). Y por último, copiamos nuestro script para crear nuestro esquema en la carpeta docker-entrypoint-initdb.d/

Vamos ahora a crear nuestra imagen a partir del fichero Dockerfile.

Ahora, al levantar nuestro contenedor por primera vez, se nos creará la base de datos y se ejecutará el script init_script.sql.

$ docker run -d -p 3306:3306 --name mysql-db mysql-db/basic

Con esto ya tenemos corriendo nuestro contenedor MySQL. Si accedemos a él, podremos ver que hay un nuevo esquema myapp, tal y como habíamos definido en el Dockerfile.

Y veremos también que en nuestro esquema, se han creado las tablas que había en el script junto con los inserts:

Podemos probar a insertar un nuevo registro en esta tabla y parar el contenedor:

$ docker stop mysql-db

Si volvemos a arrancar el contenedor veremos que el registro creado sigue estando ahí gracias a la persistencia mediante el volumen.

$ docker start mysql-db

Por otro lado, si eliminásemos el contenedor y lo volviéramos a crear, éste estaría de nuevo en su estado inicial, con tal solo dos roles que eran los que habíamos creado en el script.

Categorías