Docker-compose проверка, готово ли соединение mysql [версия 3] - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь запустить один контейнер после инициализации MySQL.

Это не было проблемой в docker-compose v2.1 В версии 3 из docker-compose depends-on больше не имеет оператора condition . * * 1011

Моя текущая настройка выглядит так:

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 или в качестве обходного пути?

1 Ответ

0 голосов
/ 30 августа 2018

Мы достигли этого с помощью пользовательского ENTRYPOINT в нашем образе Docker.

Это сценарий оболочки, который используется в качестве точки входа. Он содержит некоторый код 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...