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

igetnqfo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(913)

我试图在mysql初始化后启动一个容器。
这不是docker compose v2.1版本中的问题 3docker-compose 这个 depends-on 不具备 condition 再也不说了。
我当前的设置如下所示:

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] Connection refused 因为mysql容器还没有准备好。
有没有一个建议的方法来解决这个问题 docker-compose 版本3或任何一种解决方法?

kmb7vmvb

kmb7vmvb1#

我们有一个习惯 ENTRYPOINT 在我们的 Docker 形象。
这是用作入口点的shell脚本。它包含一些python代码来检查数据库是否处于活动状态,但应该与php类似。脚本循环,直到它能够成功连接到数据库,然后(在 exec 行)运行 CMD 从dockerfile。


# !/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 "$@"

您需要将此脚本保存在一个文件中,并将其设置为 entrypoint 为了你的 test 服务于 docker-compose.yml .

相关问题