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);
}
给出:
string(59) "mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=mydb"
array(11) { ["driver"]=> string(5) "mysql" ["host"]=> string(8) "database" ["port"]=> string(4) "3306" ["database"]=> string(6) "mydb" ["username"]=> string(4) "root" ["password"]=> string(21) "mypass" ["charset"]=> string(4) "utf8" ["collation"]=> string(15) "utf8_unicode_ci" ["prefix"]=> string(0) "" ["unix_socket"]=> string(27) "/var/run/mysqld/mysqld.sock" ["name"]=> string(5) "mysql" }
root`(用户名)
mypass
(密码)
为什么我仍然收到错误消息?
我发现了问题。
如果您查看 $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]
可能的原因如下
MYSQL 不是 运行
数据库设置不正确
服务器资源不足
根据你的场景分析,可能是数据库设置不正确
我这边的可能建议是在 Laravel 中找到正确的数据库设置。
- 确保主机正确
- 确保用户名正确
- 确保密码正确
在大多数情况下,问题在于 docker 中的主机解析,为此我建议您找到 laravel 容器能够与 mysql 容器
按照此 tutorial 中描述的步骤或使用现有系统验证这些步骤可能会解决您的问题。
我需要让旧版本的 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 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);
}
给出:
string(59) "mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=mydb"
array(11) { ["driver"]=> string(5) "mysql" ["host"]=> string(8) "database" ["port"]=> string(4) "3306" ["database"]=> string(6) "mydb" ["username"]=> string(4) "root" ["password"]=> string(21) "mypass" ["charset"]=> string(4) "utf8" ["collation"]=> string(15) "utf8_unicode_ci" ["prefix"]=> string(0) "" ["unix_socket"]=> string(27) "/var/run/mysqld/mysqld.sock" ["name"]=> string(5) "mysql" }
root`(用户名)
mypass
(密码)
为什么我仍然收到错误消息?
我发现了问题。
如果您查看 $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]
可能的原因如下
MYSQL 不是 运行
数据库设置不正确
服务器资源不足
根据你的场景分析,可能是数据库设置不正确
我这边的可能建议是在 Laravel 中找到正确的数据库设置。
- 确保主机正确
- 确保用户名正确
- 确保密码正确
在大多数情况下,问题在于 docker 中的主机解析,为此我建议您找到 laravel 容器能够与 mysql 容器
按照此 tutorial 中描述的步骤或使用现有系统验证这些步骤可能会解决您的问题。