У меня запущено приложение в 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?
Почему, черт возьми, мне отказывают в подключении?