簡體   English   中英

Laravel 和 docker 數據庫錯誤:SQLSTATE[HY000] [2002] php.network_getaddresses: getaddrinfo failed: Name does not resolve

[英]Laravel with docker database error: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve

我知道有類似的問題,但答案無濟於事。

我有這個服務器,我以前安裝了以下兩個存儲庫:

現在我添加了一個 Laravel 應用程序。 Laravel 應用程序現在正在運行,域已由 Nginx 代理正確解析,Letsencrypt 正在正常運行。

但是,現在問題出在數據庫連接上。 當我運行php artisan migrate --seed時,出現以下錯誤:

在 Connection.php 第 671 行中:

SQLSTATE[HY000] [2002] php.network_getaddresses: getaddrinfo failed: Name does not resolve (SQL: select * from information_schema.tables 其中 table_schema = mydb and table_name = migrations and table_type = 'BASE TABLE')

在 Connector.php 行 70: SQLSTATE[HY000] [2002] php.network_getaddresses: getaddrinfo failed: Name does not resolve

在 Connector.php 行 70: PDO::__construct(): php.network_getaddresses: getaddrinfo failed: Name does not resolve

這是我的docker-compose.yml文件:

version: '3'

networks:
    default:
       external:
         name: ${NETWORK}

services:
  nginx:
    image: nginx:stable-alpine
    container_name: app-webserver
    expose:
      - "80"
      - "443"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_HOST=${LETSENCRYPT_HOST}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
    depends_on:
      - php
      - mysql

  mysql:
    image: mysql:5.7.29
    container_name: app-mysql
    restart: unless-stopped
    tty: true
    expose:
      - "3306"
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql

  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: app-php
    volumes:
      - ./src:/var/www/html
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_HOST=${LETSENCRYPT_HOST}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
    expose:
      - "9000"

  composer:
    image: composer:latest
    container_name: composer
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php

  npm:
    image: node:13.7
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: artisan
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']

在 Laravel .env文件中,我已經嘗試了DB_HOST的所有可能值:

DB_HOST=localhost
DB_HOST=127.0.0.1
DB_HOST=mysql
DB_HOST=app-mysql

目前,我已經為 MySQL 容器名稱設置了它:

DB_HOST=app-mysql

其他值是:

DB_CONNECTION=mysql
DB_PORT=3306

我仍然得到那個錯誤。

我嘗試了從 app-php 容器到 app-mysql 容器的 ping 命令,如下所示:

$ docker exec -ti app-php ping app-mysql

我確實得到回應:

64 bytes from 172.18.x.x: seq=0 ttl=64 time=0.132 ms
64 bytes from 172.18.x.x: seq=1 ttl=64 time=0.240 ms
64 bytes from 172.18.x.x: seq=2 ttl=64 time=0.207 ms
64 bytes from 172.18.x.x: seq=3 ttl=64 time=0.208 ms

但是,如果我運行:

$ docker-compose run --rm artisan ping app-mysql

我收到以下錯誤:

命令“ping”未定義。

現在,如果我運行docker-compose up以查看發生了什么(沒有-d ),我將看到以下內容,對於 MySQL:

app-mysql | 2020-07-29T15:43:24.159355Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
app-mysql | 2020-07-29T15:43:24.159523Z 0 [Note] IPv6 is available.
app-mysql | 2020-07-29T15:43:24.159582Z 0 [Note]   - '::' resolves to '::';
app-mysql | 2020-07-29T15:43:24.159688Z 0 [Note] Server socket created on IP: '::'.

那里有人知道如何解決這個問題嗎? 為什么 Artisan 或 PHP 容器無法連接到數據庫容器?

解決方法

我改用Laradock解決了這個問題

簡而言之:在PHP命令之前添加Sail

詳細的:

當您提示命令時,您使用本地 PHP 庫。 這就是為什么你得到一個錯誤,因為你的本地 PHP 正在尋址到 docker-mysql 連接,在本地機器上你沒有這樣的連接。 當您使用 Laravel Sail 時,您應該提示命令

sail PHP artisan migrate

這意味着,您正在從 Docker 的 PHP 庫中提示

因為你正在做container_name: app-mysql inside of docker compose.network 你應該使用主機名app-mysql

最簡單的檢查方法是連接到 php 容器並嘗試 ping app-mysql ,然后使用 mysql 控制台測試連接。 這樣你至少可以找到問題出在哪里。

順便說一下,因為它是 docker compose - 你必須做docker compose downdocker compose up -d每次你在docker-compose.yml中做改變

我希望這對那些已經完成解決方案但尚未成功的人有所幫助。 我遇到了類似的問題,並嘗試將 DB_HOST localhost 更改為 127.0.0.1 也使用容器/數據庫主機的名稱(如 docker-compose 中所述),但我無法解決此錯誤。 所以我像這樣更新了 my.env 文件:

DB_CONNECTION=mysql
DB_HOST=host.docker.internal
DB_PORT=3308 or any other port
DB_DATABASE=your_database_name
DB_USERNAME=your_user_name
DB_PASSWORD=your_password

開始工作了。 我不保證它 100% 有效,但如果其他選項不起作用,您可以嘗試一下。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM