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

问题描述 投票:0回答:1

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

This was not an issue in docker-compose v2.13的版本docker-compose depends-on doesn't have the condition statement anymore

我目前的设置如下:

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或任何类型的解决方法中是否有针对此问题的推荐方法?

mysql docker docker-compose
1个回答
0
投票

我们在Docker镜像中使用自定义ENTRYPOINT实现了这一目标。

这是一个用作入口点的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 "$@"

您需要将此脚本保存在文件中,并将其设置为entrypointtest服务的docker-compose.yml

© www.soinside.com 2019 - 2024. All rights reserved.