Sql Server + Docker - Health Check

Ola PessoALL,
Espero que esteja tudo bem com voces e seus familiares nessa pandemia que estamos vivendo, o mais importante agora é manter a sanidade mental!
Queria compartilhar uma quicktip hoje, tenho trabalhado bastante com testes de integração ultimamente no processo de modernização de um projeto que trabalho e me deparei com um cenário.
Criei uma nova api, um novo projeto de testes e um pipeline no Azure DevOps usando tudo o que eu sempre sonhei:
- asp.net core
- docker
- sql server (container)
- testes de integração
- cobertura de código
- testes e2e
Só tinha um problema, o bom e velho funciona na minha máquina mas não no servidor.
Todos os testes funcionavam no VS e funcionavam com o script que era executado no Azure DevOps mas ao executar a CI as vezes eu tinha erros nos testes.
Após quebrar a cabeça um pouco, percebi que faltava um health check no meu container, uma vez que na minha máquina o container ja estava em execução e no servidor de CI ele acabara de ser criado.
Para evitar esses problemas, segue como podemos fazer para adicionar um health check em nosso container.
Docker Compose
Como estou usando docker compose para iniciar o container, observe as instruções na sessão healthcheck
Testando o estado do container
Após o health check adicionado, alterei o script de testes para poder executar os comandos no container apenas quando o mesmo estiver com o estado health
# Starts required services
docker-compose -f docker-compose.yml up -d
Write-Host "Compose Services UP"
# Waits until the conatiner is in healthy state (accepting connections)
$sqlstate = docker inspect -f '{{json .State.Health.Status}}' dev_sql
do {
Write-Host $sqlstate
Start-Sleep 1
$sqlstate = docker inspect -f '{{json .State.Health.Status}}' dev_sql
} while ($sqlstate -ne "`"healthy`"")
# Runs sql scripts
docker exec -t dev_sql /opt/mssql-tools/bin/sqlcmd `
-S 127.0.0.1 -U sa -P "yourStrong(!)Password" `
-V 17 `
-Q "DROP DATABASE [ci_test]"
Espero que essa dica possa ser útil para vocês.
[]s e até a próxima!