Как настроить MySQL в Docker и подключиться к нему? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь настроить тест e2e.Для этого мне нужна локальная тестовая база данных, предпочтительно в Docker, чтобы настройка теста была простой.Вот минимальный проект, показывающий, что у меня сейчас есть: https://gitlab.com/MakotoE/mysql-test Если эта проблема исправлена, npm test завершится с кодом выхода 0. Это выполняется в Windows 10.

В main.js, Я запускаю экземпляр образа Docker mysql:8.0 следующим образом:

const command = 'docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 -d mysql:8.0';
ChildProcess.execSync(command);

Я хочу подключиться к нему с помощью mysql2, но это не удается с Error: connect ETIMEDOUT.

await mysql.createConnection({
    host: 'localhost',
    user: 'root',
});

Если я пытаюсь подключиться к базе данных, созданной в коде JavaScript, через командную строку (mysql -uroot), я получаю эту ошибку: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0.Если я создаю контейнер в командной строке с помощью той же команды docker run, которая использовалась в коде, я могу успешно подключиться, поэтому эта проблема может быть связана с ChildProcess.execSync, но я не знаю, как это исправить.

Как я могу исправить свой код, чтобы я мог запустить сервер MySQL в Docker и подключиться к нему в Node.js, работающем в Windows 10?

Редактировать: Я не уверен, связано ли это, но при запуске этого в Debian появляется следующее сообщение об ошибке при создании контейнера:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/57f5b631e551466e1f9928ba62f7a5e2a5ad2a481da4686bda8684f1a71b8d7/stop: dial unix /var/run/docker.sock: connect: permission denied

И соединение не устанавливается с ETIMEDOUT.

Редактировать: я добавил ветку secondAttempt, где я безуспешно пыталсязапуск всех команд вне файла .js через сценарии NPM.После запуска теста для этой ветви вы должны вручную остановить контейнер Docker.

В команде mysql -uroot она завершается с ошибкой:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

, что, как я считаю, является той же ошибкой, что иопыт работы с разными сообщениями (из-за разных клиентов).

Этот эксперимент говорит мне две вещи: ChildProcess.execSync не является основной причиной этой проблемы, и что что-то есть в этой системе (будь тоDocker или TCP-соединение с Docker), которое предотвращает выполнение команд по сценарию.

1 Ответ

0 голосов
/ 06 декабря 2018

Я наконец понял это.Все, что мне нужно сделать, это подождать 15 секунд перед подключением.

Ошибка, которую я сделал, является обычной: не читать файл readme.На странице MySQL Docker Hub, в разделе «Нет соединений до завершения инициализации MySQL», упоминается, как нужно ждать завершения инициализации базы данных.Примеры репозиториев достигают этого с помощью цикла, чтобы повторить попытку соединения, но я думаю, что проще отложить на определенный период времени.

Раньше у меня было впечатление, что мне нужно было подождать всего ~ 1 секунду после docker run, но на самом деле инициализация базы данных занимает ~ 14 секунд.Исправление было таким же простым, как использование setTimeout, чтобы подождать 15-20 секунд перед подключением к базе данных.Я привел пример в ветке fixed!.

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