提问者:小点点

Laravel 4.2的Docker在连接到DB时抛出错误:SQLSTATE[HY000][2002]没有这样的文件或目录


我需要一个老版本的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

我将数据库数据添加到config(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登录。

如果我在LaravelIlluminate/database/connectors/connector.php类中转储连接,我会看到正在使用正确的配置。

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);
    }

给予:

>

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

    数组(11){[“driver”]=>string(5)“mysql”[“host”]=>string(8)“database”[“port”]=>string(4)“3306”[“database”]=>string(4)“root”[“password”]=>string(21)“mypass”[“charset”]=>string(4)“utf8”[“collation”]=>string(15)“utf8_unicode_ci”[“prefix”]=>string(0)“[”unix_socket“]=>string(27)”

    超级用户`(用户名)

    mypass(密码)

    为什么我仍然得到错误?


  • 共2个答案

    匿名用户

    我发现问题了。 如果查看Illuminate/database/connectors/connector.phpCreateConnection中的$dsn-值:

    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";
    

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

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

    匿名用户

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

    >

  • MySQL未运行

    数据库设置不正确

    服务器资源不足

    根据对方案的分析,可能的原因是数据库设置不正确

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

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

    在大多数情况下,问题在于docker中的主机解析,因此我建议您找到正确的主机名和端口,以便laravel容器能够与mysql容器连接

    按照本教程中描述的步骤进行操作,或者用您现有的系统验证步骤,可能会解决您的问题。