在 Docker PostgreSQL 容器中迁移错误 'could not translate host name' 运行 Laravel
Error 'could not translate host name' running Laravel migration in Docker PostgreSQL container
好吧,我有一个带有 PostgreSQL 的容器,我从 Laravel 连接到它,在屏幕上显示记录。 Laravel 容器访问 PostgreSQL 数据正常。这是结果:
object(Illuminate\Support\Collection)#463 (2) {
["items":protected]=>
array(2) {
[0]=>
object(stdClass)#466 (3) {
["pru_id"]=>
int(1)
["pru_name"]=>
string(5) "george"
["pru_years"]=>
int(45)
}
[1]=>
object(stdClass)#467 (3) {
["pru_id"]=>
int(2)
["pru_name"]=>
string(5) "paul"
["pru_years"]=>
int(30)
}
}
}
到目前为止非常好!
但是当我尝试 运行 迁移时,php artisan migrate
,我得到:
SQLSTATE[08006] [7] could not translate host name "pgcontainer" to address: Name or service not known
正在检查连接,db_host:(pgcontainer
)
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'pgcontainer'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'mydatabase'),
'username' => env('DB_USERNAME', 'myuser'),
'password' => env('DB_PASSWORD', 'mypass'),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
我尝试修改主机,因为我了解它无法识别的内容,将 pgcontainer
更改为 127.0.0.1
,但是在执行此操作时发生了两件有趣的事情:
- 在屏幕上: 它不再在屏幕上显示记录,因为 Laravel 容器不再访问 PostgreSQL:
SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432
- SSH - PHP ARTISAN MIGRATE: 现在 Laravel 可以看到 PostgreSQL 容器,但无法进行身份验证(密码正确,因为它显示记录之前在屏幕上):
SQLSTATE[08006] [7] FATAL: password authentication failed for user "mydatabase"
有什么想法吗?
如果我没理解错的话,你有一个装有 Postgres 的容器,另一个装有 Laravel 的容器。来自 Laravel -> Postgres 容器的连接工作正常。
您看到的错误表明您 运行 php artisan migrate
在您的主机上,而不是在容器中。但是您的主机不知道 pgcontainer
是什么意思 - Docker 按名称解析容器,但您的主机不能。
您应该 运行 php artisan <anything>
来自 PHP/Laravel 所在的容器内,例如:
docker exec your_laravel_container_name php artisan migrate
这样 artisan
在容器 中运行 ,并且主机名解析的工作方式与 Laravel 相同。不要更改您的 .env
或配置,artisan
是 Laravel 的一部分并且需要与 Laravel 应用程序本身相同的配置。
好吧,我有一个带有 PostgreSQL 的容器,我从 Laravel 连接到它,在屏幕上显示记录。 Laravel 容器访问 PostgreSQL 数据正常。这是结果:
object(Illuminate\Support\Collection)#463 (2) {
["items":protected]=>
array(2) {
[0]=>
object(stdClass)#466 (3) {
["pru_id"]=>
int(1)
["pru_name"]=>
string(5) "george"
["pru_years"]=>
int(45)
}
[1]=>
object(stdClass)#467 (3) {
["pru_id"]=>
int(2)
["pru_name"]=>
string(5) "paul"
["pru_years"]=>
int(30)
}
}
}
到目前为止非常好!
但是当我尝试 运行 迁移时,php artisan migrate
,我得到:
SQLSTATE[08006] [7] could not translate host name "pgcontainer" to address: Name or service not known
正在检查连接,db_host:(pgcontainer
)
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'pgcontainer'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'mydatabase'),
'username' => env('DB_USERNAME', 'myuser'),
'password' => env('DB_PASSWORD', 'mypass'),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
我尝试修改主机,因为我了解它无法识别的内容,将 pgcontainer
更改为 127.0.0.1
,但是在执行此操作时发生了两件有趣的事情:
- 在屏幕上: 它不再在屏幕上显示记录,因为 Laravel 容器不再访问 PostgreSQL:
SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432
- SSH - PHP ARTISAN MIGRATE: 现在 Laravel 可以看到 PostgreSQL 容器,但无法进行身份验证(密码正确,因为它显示记录之前在屏幕上):
SQLSTATE[08006] [7] FATAL: password authentication failed for user "mydatabase"
有什么想法吗?
如果我没理解错的话,你有一个装有 Postgres 的容器,另一个装有 Laravel 的容器。来自 Laravel -> Postgres 容器的连接工作正常。
您看到的错误表明您 运行 php artisan migrate
在您的主机上,而不是在容器中。但是您的主机不知道 pgcontainer
是什么意思 - Docker 按名称解析容器,但您的主机不能。
您应该 运行 php artisan <anything>
来自 PHP/Laravel 所在的容器内,例如:
docker exec your_laravel_container_name php artisan migrate
这样 artisan
在容器 中运行 ,并且主机名解析的工作方式与 Laravel 相同。不要更改您的 .env
或配置,artisan
是 Laravel 的一部分并且需要与 Laravel 应用程序本身相同的配置。