Docker with Laravel 4.2, connecting to DB throws error: SQLSTATE[HY000] [2002] No such file or directory

Docker with Laravel 4.2, connecting to DB throws error: SQLSTATE[HY000] [2002] No such file or directory

我需要让旧版本的 Laravel 应用正常运行。 它正在使用 Laravel 版本 4.2.2.

我有一个 docker 设置:

version: '3.5'

services:
  laravel:
    depends_on:
      - database
    ...

  database:
    image: mysql:5
    hostname: database
    environment:
      MYSQL_ROOT_PASSWORD: mypass
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypass

我将数据库数据添加到配置 (Laravel 4.2)

 'connections' => array (

            'mysql'  => array (
                'driver'    => 'mysql',
                'host'      => 'database', // as name of db container
                'database'  => 'mydb',  // this database exists, I can see in PhpMyAdmin
                'port'      => '3306',
                'username'  => 'root',  // I can login with these credentials in PhpMyAdmin and CLI
                'password'  => 'mypass',
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
            ),
...

我可以使用这些凭据登录到 phpmyadmin 容器,我也可以使用 mysql -h database -u root -p.

从 laravel 容器的 CLI 登录

如果我在 Laravel Illuminate/Database/Connectors/Connector.php class 中转储连接,我发现正在使用正确的配置。

public function createConnection($dsn, array $config, array $options)
    {
        $username = array_get($config, 'username');

        $password = array_get($config, 'password');

        // dd($dsn);
        // dd($config);
        // dd($username); dd($password);


        return new PDO($dsn, $username, $password, $options);
    }

给出:

为什么我仍然收到错误消息?

我发现了问题。 如果您查看 $dsn 中的值 Illuminate/Database/Connectors/Connector.php createConnection:

string(59) "mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=mydb"

你看到 host=database 根本就不见了,尽管我在 laravel 配置中添加了它。

手动添加解决了这个问题:

$dsn= "mysql:unix_socket=/var/run/mysqld/mysqld.sock;host=database;dbname=mydb";

尽管我在配置中添加了主机,但我发现在另一个 database-config 中有一个 unix_socket-value 添加到 mysql 配置中。 Laravel 获取套接字或主机信息。我的 host-value 没有被覆盖,但是 unix_socket-value 在其他配置中的存在阻止了通过 host.

的连接

所以我只是删除了另一个配置中的 unix_socket

SQLSTATE[HY000] [2002]可能的原因如下

  1. MYSQL 不是 运行

  2. 数据库设置不正确

  3. 服务器资源不足

根据你的场景分析,可能是数据库设置不正确

我这边的可能建议是在 Laravel 中找到正确的数据库设置。

  • 确保主机正确
  • 确保用户名正确
  • 确保密码正确

在大多数情况下,问题在于 docker 中的主机解析,为此我建议您找到 laravel 容器能够与 mysql 容器

按照此 tutorial 中描述的步骤或使用现有系统验证这些步骤可能会解决您的问题。