【问题标题】:Laravel 8 migration works, but MySQL Refuses ConnectionLaravel 8 迁移工作,但 MySQL 拒绝连接
【发布时间】:2021-11-01 10:59:29
【问题描述】:

我有一个使用 docker 的 laravel 项目设置(我目前使用 docker-compose 运行它)。该项目昨天运行良好,但今天已部分停止运行。
最令人惊奇的是,虽然migrationsseeders 工作得很好,但我无法从数据库中获取任何结果!我已经尝试清除缓存和我能找到的所有其他指南,但它们根本不起作用。 我的文件内容是:

.env

APP_NAME=bookshelf
APP_ENV=local
APP_KEY=base64:/PqZs+/8YfRYtCth0U5LATD5oOXCN/5pdAs5onk1z7U=
APP_DEBUG=true
APP_URL=http://0.0.0.0:8000

DB_CONNECTION=mysql
DB_HOST=0.0.0.0
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

docker-compose.yml

version: "3.7"

services:
  web:
    image: $COMPOSE_PROJECT_NAME
    container_name: $COMPOSE_PROJECT_NAME-laravel
    ports:
      - 8000:8000
    volumes:
      - ./:/app

  mysql:
    image: mysql:8
    container_name: $COMPOSE_PROJECT_NAME-mysql
    ports:
    - '3306:3306'
    environment:
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: secret

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    environment:
      PMA_HOST: 'mysql'
    ports:
    - '127.0.0.1:8080:80'

Dockerfile

FROM php:8.0

RUN apt-get update && apt-get install -y \
    libzip-dev \
    && docker-php-ext-install \
        pdo_mysql \
        zip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /app
COPY . /app
RUN composer install

CMD php artisan serve --host=0.0.0.0 --port=8000
EXPOSE 8000

正如我所说,以下命令完全可以正常工作:

php artisan migrate
php artisan db:seed

但是当我想加载带有以下Controller@method的页面时:

public function index()
{
    $records = Book::all();
...

books 表中获取结果,我在相应的页面/url/路由中得到以下错误:

所以...感谢您的帮助!

【问题讨论】:

    标签: php mysql docker laravel-8


    【解决方案1】:

    我解决了。出于某种原因,我的 MySQL .env 配置昨天运行良好,但我不得不将DB_HOST 设置为mysql,这是在docker-compose.yml 中创建的服务名称;所以,修改后:

    docker-compose.yml

    version: "3.7"
    
    services:
      ...
    
      mysql: # <- I copied this name
        image: mysql:8
        container_name: $COMPOSE_PROJECT_NAME-mysql
        ports:
        - '3306:3306'
        environment:
          MYSQL_USER: laravel
          MYSQL_PASSWORD: secret
          MYSQL_DATABASE: laravel
          MYSQL_ROOT_PASSWORD: secret
      ...
    

    .env

    DB_CONNECTION=mysql
    DB_HOST=mysql # <- pasted it here
    DB_PORT=3306
    DB_DATABASE=laravel
    DB_USERNAME=laravel
    DB_PASSWORD=secret
    

    我从this answer 那里得到了这个想法,我尝试了一下,它奏效了!
    我会把这个问答留给其他可能有这种模棱两可问题的人。

    编辑: 奇怪的是,在这样做之后,migrate 命令已经停止工作。
    我目前在DB_HOST=0.0.0.0migrationsseedingDB_HOST=mysql 之间摇摆不定,用于整个应用程序的其他目的...... 如果有人对此有解决方案,请告诉我

    【讨论】:

    • 是的,当你与docker打交道时,你的服务IP应该是docker服务名。 Docker 使用内部网络与docker-compose.yml 中定义的多个容器进行通信。因此,如果下次您想使用其他服务,可能是redis,那么在您的.env 中,主机应该是redis 或您为redis 容器提供的任何服务名称。
    • 我明白了,它仍然没有回答我的问题。 “如果我无法与数据库通信,为什么迁移/播种有效?”
    【解决方案2】:

    在 Laravel 中,您有 config/database.php,连接的所有设置都位于其中。在项目的根目录中还有一个.env 文件(每个人都使用它来节省时间)。这包含可用于整个项目的变量。

    在标准 L5 项目中,config/database.php 的 MySql 部分如下所示:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
        'engine'    => null,
    ],
    

    注意没有设置端口!

    虽然在我的 .env 文件中我设置了 DB_PORT=33060。但是该值 (3306) 从未读入 config/database.php。 所以不要像我一样笨,忘记检查database.php文件。

    修复 只需将 'port' => env('DB_PORT', 3306), 添加到您的 config/database.php 并在 .env 中设置该值,如下所示 DB_PORT=3306

    【讨论】:

    • 我试过了,还是不行。
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多