Симфони; SQLSTATE[HY000] [2002] Нет такого файла или каталога при использовании 127.0.0.1 в качестве database_host

Полная ошибка 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, поэтому не удивлюсь, если это ошибка. Любые советы приветствуются, потому что я в тупике.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
3 167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что ваша проблема связана с вашим 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 => нет ошибок
  • Войдите в контейнер mysql и войдите в mysql => без ошибок
  • Войдите в mysql с хоста (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, но я все еще не могу подключиться к нему с помощью диспетчера БД, и я все еще получаю ту же ошибку, что и раньше. docker inspect говорит мне, что IP-адрес 172.19.0.4, и я добавил expose: - "3306" в docker-compose.yml, но, как я уже сказал, по-прежнему никак не могу подключиться.

Alex 18.06.2019 14:50

Удалось ли вам войти в контейнер и подключиться с предоставленными учетными данными к mysql?

Ntwobike 18.06.2019 14:58

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

Alex 18.06.2019 15:01

@Alex, проверьте ответ, я обновил шаги, которые я бы диагностировал.

Ntwobike 18.06.2019 15:53

Мне удалось решить эту проблему, после некоторой отладки я получил более конкретные сообщения об ошибках, сначала отказано в соединении, затем сообщение о том, что сервер запрашивает неизвестный метод аутентификации, после чего я понял, что наконец-то подключился к базе данных. Мне удалось решить эту ошибку с помощью ответа это, поэтому сейчас я импортирую дамп базы данных размером 1,6 ГБ.

Alex 18.06.2019 16:11

Другие вопросы по теме