El docker-compose.yml tendrá la siguiente forma:
migrator:
build: ./bin/migrator
container_name: 'migrator'
depends_on:
- mysql # name of mysql container
links:
- mysql # name of mysql container
volumes:
- ${DOCUMENT_ROOT-../migrations}:/usr/src/app/migrations
user: node
working_dir: /usr/src/app
entrypoint: npm
command: start # starts npm
environment:
MYSQL_URL: mysql://USER:PASSWORD@SERVER/DATABASEDonde USER, PASSWORD y DATABASE son los credenciales del container mysql, y SERVER el nombre el mismo.
También destacar la carpeta montada migrations, que es donde se generarán los tres ficheros que veremos más adelante, y que nos
servirá para lanzar un upgrade (o downgrade) de la base de datos.
La forma más sencilla de ejecutar las instrucciones de actualización de base es mediante un script que nos conecte al container donde está el migrator. Nótese que esto es solo para ayudarnos, podemos ejecutar los códigos manualmente de forma análoga, cambiando la llamada al script por la conexión al container.
El script tendrá la siguiente forma:
migrator.sh
#!/bin/bash -e
CMD=$@
SCRIPT=`realpath -s $0`
SCRIPTPATH=`dirname $SCRIPT`
cd ${SCRIPTPATH}/docker # route from script to docker folder
docker-compose run --rm patients-migrator run migrate ${CMD}
Donde CONTAINER_NAME es el nombre del contenedor donde se está ejecutando el Database Migrator.
Para generar un nuevo .sql aplicable, utilizaremos el comando:
$ ./migrator.sh create EXAMPLEDonde EXAMPLE es el nombre del .sql que queremos generar. Esto nos creará tres ficheros:
migrations/TIMESTAMP-EXAMPLE.js: Se utiliza para determinar que hay que ejecutar el sql con este nombremigrations/sqls/TIMESTAMP-EXAMPLE-up.sql: Código sql a ejecutar para aplicar el cambio.migrations/sqls/TIMESTAMP-EXAMPLE-down.sql: Código sql a ejecutar para revertir el cambio.
Exceptuando el .js, los demás ficheros los crerá vacíos. Nosotros tenemos que encargarnos de añadir el código sql de nuestro cambio en el fichero up, y de añadir el código sql para revertir dicho cambio en down (si lo hubiese).
Como se puede observar, añade el TIMESTAMP al nombre de los ficheros, por lo que no hay que tener en cuenta el orden
alfabético para calcular el orden de ejecución. De hecho, podrían llamarse todos igual.
Para lanzar los .sql pendientes ejecutaremos:
$ ./migrator.sh upEsto añadirá todos los .sql que no hayan sido ejecutados previamente, y actualizará la tabla migrations. De esta
forma no volverá a lanzar los mismos .sql en la próxima ejecución.
Para revertir los .sql aplicados ejecutaremos:
$ ./migrator.sh downCon este comando, se ejecutarán los XXX-down.sql que haya guardados en la tabla migrations. Los aplicará en orden
inverso a como se insertaron (de más nuevo a más antiguo).