Docker-compose check if mysql connection is ready Docker-compose check if mysql connection is ready docker docker

Docker-compose check if mysql connection is ready


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

The api container will not start until the db container is healthy (basically until mysqladmin is up and accepting connections.)


If you are using docker-compose v3+, condition as an option of depends_on has been removed.

The recommended path is to use rather wait-for-it, dockerize, or wait-for. In your docker-compose.yml file, change your command to be:

command: sh -c 'bin/wait-for db:3306 -- bundle exec rails s'

I personally prefer wait-for since it can run in an Alpine container (sh compatible, no dependance on bash). Drawback is that it depends on netcat, so if you decide to use it, make sure you have netcat installed in the container, or install it in your Dockerfile, for example with:

RUN apt-get -q update && apt-get -qy install netcat

I also forked the wait-for project so it can check for healthy HTTP status (it uses wget). Then you can do something like that:

command: sh -c 'bin/wait-for http://api/ping -- jest test'

PS: A PR is also ready to be merged to add that capacity to wait-for project.


This should be enough

version: '2.1'services:  mysql:    image: mysql    ports: ['3306:3306']    environment:      MYSQL_USER: myuser      MYSQL_PASSWORD: mypassword    healthcheck:      test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD