I am trying to make sure that my app container does not run migrations / start until the db container is started and READY TO accept connections.
So I decided to use the healthcheck and depends on option in docker compose file v2.
In the app, I have the following
app:
...
depends_on:
db:
condition: service_healthy
The db on the other hand has the following healthcheck
db:
...
healthcheck:
test: TEST_GOES_HERE
timeout: 20s
retries: 10
I have tried a couple of approaches like :
- making sure the db DIR is created
test: ["CMD", "test -f var/lib/mysql/db"]
- Getting the mysql version:
test: ["CMD", "echo 'SELECT version();'| mysql"]
- Ping the admin (marks the db container as healthy but does not seem to be a valid test)
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
Does anyone have a solution to this?
The api container will not start until the db container is healthy (basically until mysqladmin is up and accepting connections.)
If you can change the container to wait for mysql to be ready do it.
If you don't have the control of the container that you want to connect the database to, you can try to wait for the specific port.
For that purpose, I'm using a small script to wait for a specific port exposed by another container.
In this example, myserver will wait for port 3306 of mydb container to be reachable.
You can find the script wait-for-it documentation here
I modified the
docker-compose.yml
as per the following example and it worked.In my case
../schemaAndSeedData
contains multiple schema and data seeding sql files.Design your own check script
can be similar to followingselect * from LastSchema.LastDBInsert
.While web dependent container code was
Hi for a simple healthcheck using docker-compose v2.1, I used:
Basically it runs a simple
mysql
commandSHOW DATABASES;
using as an example the userroot
with the passwordrootpasswd
in the database.If the command succeed the db is up and ready so the healthcheck path. You can use
interval
so it tests at interval.Removing the other field for visibility, here is what it would look like in your
docker-compose.yaml
.