@OrbiJ

Почему не выполняются запросы MySQL в докере?

Хочу сделать свой докер-контейнер с mysql на основе ubuntu. Докер файл выглядит следующим образом:
FROM ubuntu:22.04

ENV MYSQL_ROOT_PASSWORD = password

RUN apt update && apt upgrade -y
RUN apt install mysql-server -y
EXPOSE 3306 33060
CMD mysqld


Докер контейнер подымается, но при попытке получить доступ из другого контейнера через docker-compose получаю ошибку PDOException: SQLSTATE[HY000] [2002] Connection refused. В гугле нашёл, что это связано с отсутствием пароля у юзера root в mysql (ибо при установке через apt он более не запрашивается в обязательном порядке), а само обращение к контейнеру происходит следующим образом:
$connection = new PDO('mysql:host=mysql;port=3306;', 'root', 'password');


Попытался решить эту проблему, добавив следующие строки в докер файл:
FROM ubuntu:22.04

ENV MYSQL_ROOT_PASSWORD = password

RUN apt update && apt upgrade -y
RUN apt install mysql-server -y
EXPOSE 3306 33060
CMD mysqld \
&& mysql -ppassword -e "CREATE DATABASE mydb;GRANT ALL PRIVILEGES on mydb.* TO 'root'@'localhost' WITH GRANT OPTION;ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';FLUSH PRIVILEGES;"


Увы, ошибка никуда не исчезла, при этом ещё и запросы, вызываемые флагом -e не выполняются, но при этом ошибок никаких нет. Порт проверял в контейнере, стоит нужный мне 3306. Вообще не могу понять, в какую сторону думать :/
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Drno
необходимо разрешить пользователю sql, под которым подключаетесь, доступ через сеть
ну и проверить \ отключить фаерволл
Ответ написан
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
А может надо на порт 33060 подключаться?
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Из официальной доки:
The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. You can specify whether the port listens on TCP or UDP, and the default is TCP if the protocol is not specified.

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published. To actually publish the port when running the container, use the -p flag on docker run to publish and map one or more ports, or the -P flag to publish all exposed ports and map them to high-order ports.

By default, EXPOSE assumes TCP. You can also specify UDP:
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы