Docker MySQL Действия Github: подключение отклонено - PullRequest
0 голосов
/ 18 июня 2020

У меня запущено приложение в docker и я настроил Github Actions для запуска моих тестов. Для запуска тестов Behat у меня есть отдельная тестовая база данных, поэтому также должен использоваться отдельный .env.

In .env.test

DATABASE_URL=mysql://root:emc@mysql:3306/emc_test?serverVersion=5.7

In docker -compose.test.yml

version: "3.7"
services:

  mysql:
    build:
      context: docker/mysql
      dockerfile: Dockerfile
    volumes:
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: emc
      MYSQL_USER: emc
      MYSQL_PASSWORD: emc
      MYSQL_DATABASE: emc
      TZ: Europe/Brussels
    ports:
      - "3306:3306"
    networks:
      - backend

  cli:
    image: christianvermeulen/itexperts:latest
    volumes:
      - .:/application:cached
      - app-cache:/application/var/cache
      - composer:/composer
    networks:
      - backend

volumes:
  composer:
  app-cache:
  mysql-data:

networks:
  backend:

Как только я попадаю в базу данных, я получаю отказ в соединении. У меня есть эта тестовая команда, настроенная в Symfony:

<?php
declare(strict_types=1);

namespace Development\Cli;

use Development\Fixtures\LoadFixtures;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DBALException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class TestDBCommand extends Command
{
    protected static $defaultName = 'test:db';
    /**
     * @var Connection
     */
    private Connection $connection;

    public function __construct(Connection $connection)
    {
        parent::__construct();
        $this->connection = $connection;
    }

    public function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);
        $io->title('Testing Database');

        $io->note('Username: '.$this->connection->getUsername());
        $io->note('Password: '.$this->connection->getPassword());
        $io->note('Host: '.$this->connection->getHost());

        try {
            $st = $this->connection->executeQuery('show databases;');
            $result = $st->fetchAll(\PDO::FETCH_ASSOC);
            foreach ($result as $key => $value) {
                $io->note($value);
            }
        } catch (DBALException $e) {
            $io->warning('Failed: '.$e->getMessage());
        }

        $io->success('All good');

        return 0;
    }
}

Наконец, я хочу также увидеть некоторую информацию, поэтому я запускаю следующие команды в Github Actions:

- name: Prepare Testing
  run: |
    cp docker-compose.test.yml docker-compose.yml
    docker-compose build
    docker-compose up -d
    docker-compose ps
    docker-compose run --rm cli ping -c 5 mysql
    docker-compose run --rm mysql env | sort
    docker-compose run --rm -e APP_ENV=test cli bin/console test:db

Результат :

   Name                 Command              State                  Ports              
---------------------------------------------------------------------------------------
emc_cli_1     docker-php-entrypoint php -a   Exit 0                                    
emc_mysql_1   docker-entrypoint.sh mysqld    Up       0.0.0.0:3306->3306/tcp, 33060/tcp


PING mysql (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.170 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.066 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.092 ms
64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.100 ms
64 bytes from 172.18.0.3: seq=4 ttl=64 time=0.070 ms

--- mysql ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.066/0.099/0.170 ms


GOSU_VERSION=1.12
HOME=/root
HOSTNAME=7656ccf87670
MYSQL_DATABASE=emc_test
MYSQL_MAJOR=5.7
MYSQL_PASSWORD=emc
MYSQL_ROOT_PASSWORD=emc
MYSQL_USER=emc
MYSQL_VERSION=5.7.30-1debian10
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=0
TZ=Europe/Brussels

Testing Database
================

 ! [NOTE] Username: root                                                         

 ! [NOTE] Password: emc                                                         

 ! [NOTE] Host: mysql                                                           

 [WARNING] Failed: An exception occurred in driver: SQLSTATE[HY000] [2002]      
           Connection refused                                                   

 [OK] All good

Короче говоря, я проверил:

  • Имя хоста правильное
  • Ожидаемое имя пользователя и пароль верны
  • Порт 3306 отображается (хотя это не обязательно внутри)
  • mysql контейнер запущен
  • mysql доступен (pingable) из контейнера cli
  • mysql В контейнере есть подходящие переменные среды для настройки

Наконец, у меня есть 2 запуска с кодом точный с разными результатами. В чем может быть проблема переменной в Github Actions?

Failure Success

Почему, черт возьми, мне отказывают в подключении?

1 Ответ

1 голос
/ 19 июня 2020

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

Следовательно, ping был в порядке, env в порядке, контейнер работал, но служба mysql не работала (пока).

При выполнении этого в автоматизированной среде (например, конвейеры CI) он работает слишком быстро по сравнению с ручная среда, такая как localhost.

Решение: Измените порядок ваших команд, чтобы дать больше времени mysql для запуска или добавить в короткий сон на пару секунд.

...