VSCode Development Containers - Programa dentro de un contenedor incluyendo tu Base de Datos
- 4 min read
En esta ocasión vamos a usar una característica de VS Code llamad Development Containers, donde utilizamos el poder de Docker para volver replicable nuestro entorno de desarrollo (usando un container) pero editando usando nuestro amado editor VS Code como si estuviéramos en nuestro propio devbox Linux.
Para esta demo tenemos un proyecto de ASP.NET 6.0 el cual necesita una Base de Datos en SQL Server para la cual ya tenemos un backup listo con las tablas y datos. Usaremos este ejemplo para esta demostración. El repositorio de GitHub se encuentra al final.
Agregar los archivos Development Container con el template C# + MSSQL
El primer, paso será agregar el soporte de Development Containers, usando el Command Palette de VS Code (Ctrl+Shift+P en Windows) y buscando Remote-Containers Add Development Container Configuration Files…
Para tener esta opción es necesario la extensión en preview Remote-Containers (Remote - Containers - Visual Studio Marketplace) y obviamente necesitamos tener Docker for Desktop corriendo.
Entre las opciones y templates que nos provee la extensión tenemos la opción de C# (.NET) and MS SQL, que es la que necesitamos pues incluye .NET SDK y un contenedor para la Base de Datos MS SQL. Esta opción es mas avanzada y en lugar de usar solo un DockerFile utiliza Docker-compose para soluciones multi-containers.
Con esta opción seleccionada, podemos darle reopen in container o volver a abrir el proyecto dentro de un contenedor. Al elegir esa opción podemos explorar el entorno de desarrollo creado para nosotros tan pronto como Docker termine de descargar las imágenes base y compilar las imágenes finales.
Agregar el backup al contenedor de Base datos
Ahora, todo el objetivo de este video y post, era poder replicar el escenario complejo de automatizar la restauración de la base de datos a partir de un backup cosa que podamos explorar cómo funcionan los multi-containers en DevContainer.
Lo primero que necesitamos hacer, es copiar nuestro backup ( wwi.bak
) al contenedor de Base de Datos para que se pueda realizar la operación de restauración. Para eso, considerando que estamos usando Docker-compose , debemos utilizar un volumen. No olviden incluir el archivo en el folder del proyecto. En mi caso, lo estoy colocando dentro del folder .devcontainer/mssql/bak
, para mantenerlo junto al resto de archivos de VS Code DevContainers.
Con el archivo en su lugar, modificamos el archivo docker-compose.yml
e incluimos el volumen. Pueden verlo en las líneas 36 y 37 abajo.
Listar los archivos dentro del backup
Ahora, la parte tricky es que el comando de restauración de backup en SQL Server for Linux (dentro de un container) necesita realizar el movimiento de los archivos que probablemente vienen de Windows a paths en Linux. Para darle forma necesitamos saber los archivos dentro para hacer el cambio.
Pueden ver el comando que necesitamos ejecutar aquí abajo, reemplacen los valores por la ruta del backup en su caso y el password y verán un output similar al de la imagen debajo.
/opt/mssql-tools/bin/sqlcmd -S localhost \ -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' \ | tr -s ' ' | cut -d ' ' -f 1-2
Modificar el script de post-creation
Con el listado de archivos que componen nuestra base de datos podemos darle forma el comando de restauración e incluirlo en el archivo .devcontainer/mssql/postCreateCommand.sh
. Pueden ver la sintaxis WITH MOVE que hace ese cambio de paths Windows a mas apropiados en Linux.
Voilà! Nuestra BD se restaura como parte de la creación
Con los cambios en su lugar, solo necesitamos abrir nuestra Command palette
y pedirle a VS Code que reconstruya los contenedores ( rebuild container
) y ya hemos terminado.
Si quieren ver un extra sobre como agregar global dotnet tools
a la imagen base para tenerlas listas como parte del devcontainer revisen el video en Youtube.