setup - Docker-compose comprueba si la conexión mysql está lista
docker-compose mysql volume (4)
Estoy tratando de asegurarme de que el contenedor de mi aplicación no ejecute las migraciones / inicio hasta que se inicie el contenedor db y LISTO PARA aceptar conexiones.
Así que decidí usar el chequeo de salud y depende de la opción en el docker compose file v2.
En la aplicación, tengo los siguientes
app:
...
depends_on:
db:
condition: service_healthy
La db por otro lado tiene el siguiente chequeo de salud.
db:
...
healthcheck:
test: TEST_GOES_HERE
timeout: 20s
retries: 10
He intentado un par de enfoques como:
- asegurándose de que se crea el db DIR
test: ["CMD", "test -f var/lib/mysql/db"]
- Obtención de la versión de mysql:
test: ["CMD", "echo ''SELECT version();''| mysql"]
- Haga ping al administrador (marca el contenedor db como correcto pero no parece ser una prueba válida)
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
¿Alguien tiene una solución para esto?
Hola, por un simple chequeo de salud, utilicé:
/usr/bin/mysql --user=root --password=rootpasswd --execute /"SHOW DATABASES;/"
Básicamente ejecuta un simple comando mysql
SHOW DATABASES;
usando como ejemplo la root
del usuario con la contraseña rootpasswd
en la base de datos.
Si el comando se ejecuta correctamente, la base de datos está lista y lista para la ruta de comprobación de estado. Puedes usar el interval
para que pruebe a intervalos.
Eliminando el otro campo de visibilidad, esto es lo que se vería en su docker-compose.yaml
.
version: ''2.1''
services:
db:
...
healthcheck:
test: "/usr/bin/mysql --user=root --password=rootpasswd --execute /"SHOW DATABASES;/""
interval: 2s
timeout: 20s
retries: 10
app:
...
depends_on:
db:
condition: service_healthy
Si puede cambiar el contenedor para esperar a que mysql esté listo, hágalo.
Si no tiene el control del contenedor al que desea conectar la base de datos, puede intentar esperar el puerto específico.
Para ese propósito, estoy usando un pequeño script para esperar un puerto específico expuesto por otro contenedor.
En este ejemplo, myserver esperará a que se pueda acceder al puerto 3306 del contenedor mydb .
# Your database
mydb:
image: mysql
ports:
- "3306:3306"
volumes:
- yourDataDir:/var/lib/mysql
# Your server
myserver:
image: myserver
ports:
- "....:...."
entrypoint: ./wait-for-it.sh mydb:3306 -- ./yourEntryPoint.sh
Puede encontrar la documentación del script wait-for-it here
docker-compose.yml
el docker-compose.yml
según el siguiente ejemplo y funcionó.
mysql:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
# Preload files for data
- ../schemaAndSeedData:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: rootPass
MYSQL_DATABASE: DefaultDB
MYSQL_USER: usr
MYSQL_PASSWORD: usr
healthcheck:
test: mysql --user=root --password=rootPass -e ''Design your own check script '' LastSchema
En mi caso ../schemaAndSeedData
contiene múltiples esquemas y archivos de datos de ../schemaAndSeedData
datos. Design your own check script
puede ser similar al siguiente select * from LastSchema.LastDBInsert
.
Mientras que el código contenedor web dependiente era
depends_on:
mysql:
condition: service_healthy
version: "2.1"
services:
api:
build: .
container_name: api
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
db:
container_name: db
image: mysql
ports:
- "3306"
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_USER: "user"
MYSQL_PASSWORD: "password"
MYSQL_DATABASE: "database"
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 20s
retries: 10
El contenedor de api no se iniciará hasta que el contenedor de db esté en buen estado (básicamente, hasta que mysqladmin esté activo y acepte conexiones).