Symfony;SQLSTATE [HY000] [2002] Нет такого файла или каталога при использовании 127.0.0.1 как database_host - PullRequest
0 голосов
/ 18 июня 2019

Полная ошибка 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 работаетbtw;

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-синхронизировать, чтобы сделать изменения синхронизации между нашей средой разработки и фактическим контейнером), но при проверке самого контейнера с помощью exec я вижу изменения в файле parameters.yml.

Может быть проблема в том, что он пытаетсяподключиться к серверу mysql, работающему вне контейнера Docker?Я все еще новичок в Docker, поэтому я не удивлюсь, если это ошибка.Любые советы приветствуются, потому что я в тупике.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Ваш файл 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 не блокирует подключение извне (проверьте bind-адрес в конфигурации mysql, еслиэто 127.0.0.1 единственное, что позволяет подключаться к форме локально, на данный момент я бы сделал это 0.0.0.0 или прокомментировал эту строку, если она существует)

    • mysqld --verbose --help => вы увидите все опции
    • mysqld --verbose --help | grep bind-address => проверьте адрес привязки
  • Убедитесь, что у пользователя, которому я пытался войти, есть достаточно привилегий для подключения (SELECT user,host FROM mysql.user;), проверьте своего пользователяможно подключиться из Docker Network => 172.* или в любом месте => %

0 голосов
/ 18 июня 2019

Я думаю, что ваша проблема с вашим 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.

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