首页 > 解决方案 > Laravel 8 迁移工作,但 MySQL 拒绝连接

问题描述

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

.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

码头工人-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/路由中收到以下错误:

在此处输入图像描述

所以......我很感激任何帮助!

标签: phpmysqldockerlaravel-8

解决方案


我解决了。出于某种原因,我的 MySQL.env配置昨天运行良好,但我必须将服务名称设置DB_HOSTmysql,创建于docker-compose.yml; 所以,在改变它之后:

码头工人-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

我从这个答案中得到了这个想法,当我尝试它时,它奏效了!
我会把这个问答留给其他可能有这种模棱两可问题的人。

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


推荐阅读