setup compose mysql docker docker-compose dockerfile

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:

  1. asegurándose de que se crea el db DIR test: ["CMD", "test -f var/lib/mysql/db"]
  2. Obtención de la versión de mysql: test: ["CMD", "echo ''SELECT version();''| mysql"]
  3. 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).