Docker compose检查mysql连接是否就绪[版本3]

Docker compose检查mysql连接是否就绪[版本3],mysql,docker,docker-compose,Mysql,Docker,Docker Compose,我试图在MySQL容器初始化之后启动一个容器 在docker compose的3版本中,取决于 我当前的设置如下所示: test: image: php:7.2 container_name: second restart: on-failure depends_on: - mysql-test mysql-test: image: mysql:5.7 container_name: first environment:

我试图在MySQL容器初始化之后启动一个容器

docker compose的
3
版本中,
取决于

我当前的设置如下所示:

test:
    image: php:7.2
    container_name: second
    restart: on-failure
    depends_on:
        - mysql-test

mysql-test:
    image: mysql:5.7
    container_name: first
    environment:
        MYSQL_ROOT_PASSWORD: secret
    healthcheck:
        test: ["CMD", "mysqladmin", "ping", "-psecret", "-h", "localhost"]
        timeout: 30s
        retries: 10
当然,运行
docker compose up
然后在试图连接到数据库的PHP容器中执行脚本会导致
SQLSTATE[HY000][2002]连接被拒绝
,因为MySQL容器还没有准备好


docker compose
version 3或任何一种解决方法中,是否有解决此问题的推荐方法?

我们在docker图像中通过自定义
入口点实现了这一点

这是一个用作入口点的shell脚本。它包含一些Python代码来检查数据库是否处于活动状态,但它应该与PHP类似。脚本循环,直到能够成功连接到数据库,然后(在
exec
行中)从Dockerfile运行
CMD

#!/bin/bash
set -e

function db_ready(){
python << END
import sys
import sqlalchemy

try:
    engine_pro = sqlalchemy.create_engine("${DATABASE}").connect()
except (sqlalchemy.exc.SQLAlchemyError, sqlalchemy.exc.DBAPIError) as e:
    print('Error:', e)
    sys.exit(-1)
sys.exit(0)
END
}

until db_ready; do
  >&2 echo 'Waiting for database to become available...'
  sleep 1
done
>&2 echo 'Database is available'

exec "$@"
#/bin/bash
set-e
函数db_ready(){
python&2 echo“等待数据库可用…”
睡眠1
完成
>&2 echo“数据库可用”
执行官“$@”

您需要将此脚本保存在一个文件中,并将其设置为
docker compose.yml中
测试
服务的
入口点
,我正试图避免这种情况。将一个图像与另一个图像进行显式定义(即使
数据库
是可替换的)。如果我将介绍我所依赖的整个数据库堆栈,那么该脚本将大幅增长。我认为应该有一种本地方式让
docker compose
来管理它,因为docker已经跟踪健康检查的状态,所以compose可以等待。