SQL Server + Docker Compose: criando rapidamente ambientes e populando bases para testes
Containers são uma excelente alternativa para a rápida montagem de ambientes de testes, facilitando em muito a criação de instâncias dos mais variados tipos de serviços de apoio. A utilização de tecnologias de bancos de dados a partir de containers talvez represente um dos melhores exemplos desta prática, com a disponibilização de instâncias de serviços como o SQL Server em poucos segundos.
Mas e se quisermos ir além, criando inclusive bases de dados e até populando as mesmas com ao optar por se trabalhar com SQL Server via containers?
Há inúmeros exemplos na Web em que novas imagens do SQL Server são criadas, tomando como base a imagem original deste SGBD e reconfigurando a subida do serviço principal. Tudo isto visando garantir que os scripts sejam executados com o SGBD já operante, embora se traduza em uma série de esforços e scripts extras.
Não há então outra forma mais simples de se fazer isto?
Felizmente a resposta a esta segunda pergunta é SIM! A Microsoft também oferece a imagem pública mcr.microsoft.com/mssql-tools, uma excelente alternativa que conta com as ferramentas de linha de comando sqlcmd (para execução de scripts e comandos SQL) e bcp (para Bulk Copy).
Criando e acessando navegando por um container baseado nesta imagem com a instrução:
docker run -it mcr.microsoft.com/mssql-tools
Podemos observar algumas características interessantes da mesma:
Podemos observar algumas características interessantes da mesma:
- O diretório tmp (destacado em verde) suporta operações de gravação e pode receber scripts, de forma que um container de mcr.microsoft.com/mssql-tools ao se comunicar com outro que represente uma instância do SQL Server consiga executar tais instruções;
- Os executáveis das ferramentas sqlcmd e bcp se encontram no diretório /opt/mssql-tools/bin.
Podemos criar um arquivo (init-basegeografica.sh) para execução ordenada destes scripts via bash:
- As 2 instruções neste exemplo empregam o sqlcmd, referenciando os arquivos com os scripts na sequência;
- Foram informados ainda o nome da instância do SQL Server (sqlserver, que corresponde ao nome do container deste SGBD), usuário (sa) e senha de acesso (SqlServer2019!). Importante destacar que essas configurações serão as mesmas usadas na criação do container do SQL Server.
Na próxima imagem observamos que os scripts (arquivos .sql e .sh) estão no mesmo diretório do arquivo do Docker Compose, com as definições do ambiente de testes a ser gerado:
Analisando o conteúdo do docker-compose.yml é possível destacar:
- O container sqlserver faz uso da imagem mcr.microsoft.com/mssql/server:2019-latest, contando com as mesmas configurações de acesso (usuário e senha) que constam no script init-basegeografica.sh;
- Já o container mssqltools (baseado na imagem mcr.microsoft.com/mssql-tools) depende de sqlserver, como especificado em depends_on. Em volumes temos a cópia dos arquivos de scripts (01-BaseGeografica.sql, 02-BaseGeografica.sql e init-basegeografica.sh) para o diretório tmp de nosso container (lembrando que n arquivos poderiam ser copiados);
- Finalmente no parâmetro command de mssqltools temos uma instrução envolvendo a execução via bash do script init-basegeografica.sh (que foi copiado para o diretório tmp do container mssqltools). O relacionamento configurado via depends_on entre os containers sqlserver e mssqltools permite que este último consiga acessar a instância do SGBD sem maiores dificuldades, evitando que se especifique até mesmo a porta deste serviço.
A instrução a seguir permitirá que se criem os containers especificados no arquivo docker-compose.yml:
docker-compose up -d
Após executar este comando podemos verificar com a instrução docker-compose ps que o serviço do SQL Server está ativo (o container mssqltools retornará o status Exit 0, indicando sua a conclusão de sua execução sem erros):
Para verificar se tudo funcionou dentro do esperado acessei a instância do SQL Server e o banco BaseGeografica via Azure Data Studio. Foi possível então observar que as tabelas dbo.Regioes e dbo.Estados foram criadas e populadas corretamente:
Os scripts utilizados neste artigo foram disponibilizados no seguinte repositório do GitHub:
https://github.com/renatogroffe/DockerCompose-SqlServer-DBInitialization_DadosGeograficos
Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!