Docker compose检查mysql连接是否就绪[版本3]
我试图在MySQL容器初始化之后启动一个容器 在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:
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可以等待。