在 Docker PostgreSQL 容器中运行 Laravel 迁移时出现错误“无法翻译主机名”

ren*_*or9 1 docker laravel-8

好吧,我有一个带有 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)
    }
  }               
}
Run Code Online (Sandbox Code Playgroud)

到目前为止非常好!

但是当我尝试运行迁移时,php artisan migrate我得到:

SQLSTATE[08006] [7] 无法将主机名“pgcontainer”转换为地址:名称或服务未知

检查连接,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',
],
Run Code Online (Sandbox Code Playgroud)

我尝试修改主机,因为我了解它无法识别的内容,更改pgcontainer127.0.0.1,但是在执行此操作时发生了两件有趣的事情:

  1. 在屏幕上:它不再在屏幕上显示记录,因为 Laravel 容器不再访问 PostgreSQL:

SQLSTATE[08006] [7] 无法连接到服务器:连接被拒绝 服务器是否在主机“127.0.0.1”上运行并接受端口 5432 上的 TCP/IP 连接

  1. SSH - PHP ARTISAN MIGRATE:现在 Laravel 可以看到 PostgreSQL 容器,但无法进行身份验证(密码在屏幕上显示记录之前是正确的):

SQLSTATE[08006] [7] 致命:用户“mydatabase”的密码身份验证失败

任何想法?

Don*_*nic 5

如果我理解正确的话,您有一个包含 Postgres 的容器,以及另一个包含 Laravel 的容器。Laravel -> Postgres 容器的连接工作正常。

您看到的错误表明您正在php artisan migrate主机上运行,​​而不是在容器中运行。但你的主机不知道这pgcontainer意味着什么 - Docker 通过名称解析容器,但你的主机不能。

您应该php artisan <anything>从 PHP/Laravel 所在的容器内部运行,例如:

docker exec your_laravel_container_name php artisan migrate
Run Code Online (Sandbox Code Playgroud)

这种方式在容器内部artisan运行,主机名解析的工作方式与 Laravel 相同。不要更改您的或 配置,它是 Laravel 的一部分,需要与 Laravel 应用程序本身相同的配置。.envartisan