Gitlab CI Symfony: SQLSTATE [HY000] [2002] Соединение отклонено

Я использую gitlab для запуска модульных тестов каждый раз, когда кто-то нажимает на код. Я получаю эту ошибку во время установки композитора.

> Incenteev\ParameterHandler\ScriptHandler::buildParameters
Creating the "app/config/parameters.yml" file
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000] [2002] Connection refused[PDOException]
SQLSTATE[HY000] [2002] Connection refusedScript Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the post-install-cmd event terminated with an exception

Вот моя конфигурация:

.файл gitlab-ci.yml

    # Select image from https://hub.docker.com/_/php/
image: php:5.6

# Select what we should cache
cache:
paths:
- vendor/

before_script:
# Install ssh-agent if not already installed, it is required by Docker.
# (change apt-get to yum if you use a CentOS-based image)
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

#

Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)

# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
- ssh-add <(echo "$SSH_PRIVATE_KEY")

# For Docker builds disable host key checking. Be aware that by adding that
# you are suspectible to man-in-the-middle attacks.
# WARNING: Use this only with the Docker executor, if you use it with shell
# you will overwrite your user's SSH config.
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

- cp ci/custom.ini /usr/local/etc/php/conf.d/custom.ini
- bash ci/docker_install.sh > /dev/null

# Install composer
- curl -sS https://getcomposer.org/installer | php

services:
- mysql:latest

variables:
# Configure mysql service (https://hub.docker.com/_/mysql/)
MYSQL_DATABASE: symfony
MYSQL_ROOT_PASSWORD: root

# We test PHP5.6 (the default) with MySQL
test:mysql:
script:
# Install all project dependencies
- php composer.phar install
- phpunit --coverage-text --colors=never -c app/

parameters.yml.dist

parameters:
database_host:     127.0.0.1
database_port:     ~
database_name:     symfony
database_user:     root
database_password: root

mailer_transport:  smtp
mailer_host:       127.0.0.1
mailer_user:       ~
mailer_password:   ~

# A secret key that's used to generate certain security-related tokens
secret:            ThisTokenIsNotSoSecretChangeIt

database_slave1_host: 127.0.0.1
database_slave1_port: ~
database_slave1_name: symfony
database_slave1_user: root
database_slave1_password: root

Я прочитал и следую инструкциям на сайте gitlab. Может быть, моя ошибка очевидна, но я ее не вижу.

3

Решение

Поскольку вы используете MySQL, который работает в другом контейнере, вы должны использовать его имя хоста, а не 127.0.0.1. Правильный хост базы данных должен быть «mysql». Это покрыто один из разделов документации GitLab:

Контейнер службы для MySQL будет доступен под именем mysql. Итак, чтобы получить доступ к службе базы данных, вам нужно подключиться к хосту с именем mysql вместо сокета или локального хоста.

7

Другие решения

Одна из возможных проблем, связанных с этой ошибкой, заключается в том, что вы пытаетесь получить доступ к базе данных, пока она еще инициализируется. Это покрыто в MySQL Предостережения раздел на Docker HUB.

Если при запуске контейнера база данных не инициализирована, будет создана база данных по умолчанию. Хотя это ожидаемое поведение, это означает, что он не будет принимать входящие соединения, пока такая инициализация не завершится. Это может вызвать проблемы при использовании инструментов автоматизации …

наивный Решение заключается в использовании sleep перед запуском любого процесса, который обращается к базе данных. Вы можете добавить его в before_script раздел:

before_script:
- sleep 60s

Лучшим и более сложным решением было бы повторно проверять сервер MySQL, проверяя, принимает ли он уже соединения.

0

По вопросам рекламы [email protected]