Полная ошибка Doctrine\DBAL\Exception\ConnectionException: An exception occurred in driver: SQLSTATE[HY000] [2002] No such file or directory in /app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php on line 113, но это слишком длинно для названия.
Я пытаюсь настроить проект Symfony локально, но я изо всех сил пытаюсь заставить работать соединение с базой данных. Мой parameters.yml выглядит следующим образом
parameters:
database_host: 127.0.0.1
database_port: 3306
database_name: database_name
database_user: username
database_password: password
Я много гуглил эту проблему, и большинство людей, кажется, решили проблему, изменив database_host с localhost на 127.0.0.1, но это не работает для меня. Само приложение работает через Docker, но я установил соединение с базой данных один раз через Brew и один раз с сервером MySQL для Mac. В обоих случаях я могу подключиться через командную строку и с помощью SequelPro/TablePlus, но всякий раз, когда я пытаюсь получить доступ к веб-сайту через браузер, я получаю сообщение об ошибке «Нет такого файла или каталога».
Я также пробовал несколько способов настроить контейнер Docker MySQL, но не могу заставить его работать. Мой docker-compose.yml выглядит так;
nginx:
build: nginx
ports:
- "8080:80"
links:
- php
volumes:
- ../:/app
php:
build: php-fpm
volumes:
- ../:/app
working_dir: /app
extra_hosts:
- "site.dev: 172.17.0.1"
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'database_name'
MYSQL_USER: 'username'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password_root'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- my-db:/var/lib/mysql
Но всякий раз, когда я запускаю docker-compose up -d, я получаю сообщение об ошибке Unsupported config option for services: 'db'.
Еще одна попытка была добавить
mysql:
image: mysql:latest
volumes:
- mysql_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD='password'
- MYSQL_DATABASE='database_name'
- MYSQL_USER='username'
- MYSQL_PASSWORD='password'
К файлу docker-compose, и хотя он создает образ mysql, я не могу подключиться к нему с помощью SequelPro/TablePlus. Я запустил docker-inspect на контейнере, чтобы получить IP-адрес (172.17.0.3), но не могу получить к нему доступ. Я могу exec войти в него, войти с помощью mysql -u root и создать нужного пользователя и базу данных, но тогда я все еще пытаюсь подключиться к нему.
Запуск docker ps действительно показывает, что контейнер sql работает, кстати;
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6de6030791d docker_nginx "nginx -g 'daemon of…" 19 minutes ago Up 14 minutes 0.0.0.0:8080->80/tcp docker_nginx_1
f26b832bb005 docker_php "docker-php-entrypoi…" 19 minutes ago Up 14 minutes 9000/tcp docker_php_1
6c2a9e657435 mysql:latest "docker-entrypoint.s…" 19 minutes ago Up 14 minutes 3306/tcp, 33060/tcp docker_mysql_1
Я также подумал, что это может быть проблема с изменениями в файле parameters.yml, которые не синхронизируются должным образом с контейнером, поскольку я использую Mac (на моем старом рабочем месте нам приходилось использовать docker-sync, чтобы синхронизировать изменения между нашей средой разработки и фактическим контейнером ), но при проверке самого контейнера с помощью exec я вижу изменения в parameters.yml файле.
Может ли проблема заключаться в попытке подключиться к серверу mysql, работающему вне контейнера Docker? Я все еще новичок в Docker, поэтому не удивлюсь, если это ошибка. Любые советы приветствуются, потому что я в тупике.






Я думаю, что ваша проблема связана с вашим parameters.yml:
parameters:
database_host: 127.0.0.1
Когда вы запускаете compose, MySQL и PHP будут работать в своих собственных контейнерах, которые будут иметь свои собственные IP-адреса: 127.0.0.1 или localhost из php не смогут подключиться к контейнеру db. Это похоже на то, как если бы вы развернули PHP на виртуальной машине A и MySQL на другой виртуальной машине B, но пытаетесь получить доступ к MySQL с машины A, используя localhost, где вы должны указать B IP-адрес машины или имя хоста.
С Docker Compose внутренний DNS разрешит имя службы в своем контейнере, поэтому вы можете использовать что-то вроде:
parameters:
# name of the service in compose should be resolved
database_host: db
Ошибка SQLSTATE[HY000] [2002] No such file or directory может быть вызвана, когда клиент пытается прочитать сокет MySQL, обычно присутствующий в /var/lib/mysql/mysql.sock, которого, вероятно, нет в вашем PHP-контейнере.
Ваш файл docker-compose мне кажется неправильным, попробуйте ниже файл docker-compose. Ссылки я убрал, сеть намного проще.
version: '3'
services:
nginx:
build: nginx
ports:
- "8080:80"
networks:
- backend
volumes:
- ../:/app
php:
build: php-fpm
volumes:
- ../:/app
working_dir: /app
networks:
- backend
extra_hosts:
- "site.dev: 172.17.0.1"
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'database_name'
MYSQL_USER: 'username'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password_root'
networks:
- backend
ports:
- '3306:3306'
volumes:
- ./my-db:/var/lib/mysql
networks:
backend:
driver: bridge
затем используйте database_host: db в файле php.
я бы поставил диагноз
mysql -u username -p, поскольку вы сопоставляете порт 3306 хоста)Убедитесь, что mysql.cnf не блокирует подключение извне (проверьте адрес привязки в конфигурации mysql, если это 127.0.0.1, то это единственный разрешить локальное подключение, я бы сейчас сделал 0.0.0.0 или прокомментировал эту строку, если она существует)
mysqld --verbose --help => вы увидите все вариантыmysqld --verbose --help | grep bind-address=> проверить адрес привязкиУбедитесь, что пользователь, под которым я пытался войти, имеет достаточно прав для
connect(SELECT user,host FROM mysql.user;) проверьте, может ли ваш пользователь
подключиться из сети докеров => 172.* или откуда угодно => %
Удалось ли вам войти в контейнер и подключиться с предоставленными учетными данными к mysql?
Да, если я запускаю контейнер, я могу войти в систему с помощью команды mysql, проблема заключается в подключении к нему из-за пределов контейнера.
@Alex, проверьте ответ, я обновил шаги, которые я бы диагностировал.
Мне удалось решить эту проблему, после некоторой отладки я получил более конкретные сообщения об ошибках, сначала отказано в соединении, затем сообщение о том, что сервер запрашивает неизвестный метод аутентификации, после чего я понял, что наконец-то подключился к базе данных. Мне удалось решить эту ошибку с помощью ответа это, поэтому сейчас я импортирую дамп базы данных размером 1,6 ГБ.
Все еще не работает. Он правильно создает контейнер mysql, но я все еще не могу подключиться к нему с помощью диспетчера БД, и я все еще получаю ту же ошибку, что и раньше.
docker inspectговорит мне, что IP-адрес 172.19.0.4, и я добавилexpose: - "3306"в docker-compose.yml, но, как я уже сказал, по-прежнему никак не могу подключиться.