Используя Docker и Laravel, я получил эту ошибку с MySQL: «SQLSTATE [HY000] [2002] Нет такого файла или каталога» - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть приложение в laravel 5.2, которое подключается к моей локальной базе данных в mysql, никаких проблем.Но когда я помещаю свое приложение в докер-контейнер, я не могу подключиться к своей базе данных, и у меня появляется эта ошибка:

SQLSTATE[HY000] [2002] No such file or directory

Если я изменю DB_HOST в моем файле .env на127.0.0.1 вместо localhost, тогда я получил другое:

SQLSTATE[HY000] [2002] Connection refused

Я прочитал, что проблема может быть в пути к сокету в php.ini

$ ls -l /var/run/mysqld/mysqld.sock
$ srwxrwxrwx 1 mysql mysql 0 nov 27 08:31 /var/run/mysqld/mysqld.sock

Итак, я включил только в случаеиз pdo:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

Часть моего .env

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=developer
DB_PASSWORD=123456

My database.php

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

Я использовал docker compose для монтирования контейнера, потому что япланирую создать другие микросервисы позже:

version: "3.3"
services:
   api_test:
      build: .
      ports:
         - "8181:8181"
      env_file:
         - ./.env
      environment:
         - PORT:8181

Мой Dockerfile:

FROM php:7.1.5-apache

RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo pdo_mysql mbstring
WORKDIR /api_test
COPY . /api_test
RUN composer install
RUN a2enmod rewrite
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181

Я использую:

  • Debian 9.6, ядро ​​4.9.0-8-amd64

  • Apache / 2.4.25

  • PHP 7.0.30-0 + deb9u1

  • MariaDB 10.1.37 сервер базы данных

Есть мысли?

Ответы [ 2 ]

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

Я нашел решение.Или тот, который работает для меня.Я нашел это здесь и здесь

Проблема заключалась в удаленном доступе в моей локальной базе данных mysql.Сеть моего контейнера отличалась от моей локальной.И у меня не было разрешений принимать подключения извне.

My my.cnf

[mysqld]
bind-address = 0.0.0.0

Разрешения

mysql> grant all privileges on *.* to 'developer'@'%' identified by '123456';
mysql> flush privileges;

РЕДАКТИРОВАНИЕ

Я забыл добавить, что изменение моего DB_HOST по моему локальному IP (из назначенного ip маршрутизатора) в мой файл .env также было необходимо.

0 голосов
/ 30 ноября 2018

localhost или 127.0.0.1 неверно, если вы находитесь внутри контейнера, потому что ваш контейнер будет вызывать внутри контейнера, а не на вашем хост-компьютере.

Вы должны взять свой локальный IP с помощью команды ifconfig, обязательно "192.168 ...." и замените localhost этим IP.

Вы также можете создать свою базу данных в контейнере, это проще.

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