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