Docker-Compose搭建Laravel5+MySQL8环境后迁移未生成表求助
以下是Docker-Compose环境下常见的原因及解决办法:
数据库连接配置不匹配
检查Laravel根目录下的.env文件,确保DB_HOST是Docker-Compose中MySQL服务的名称(比如你的compose文件里MySQL服务叫mysql,就填mysql,不要填localhost或127.0.0.1,因为容器内的localhost指向自身)。同时确认DB_DATABASE、DB_USERNAME、DB_PASSWORD和MySQL容器初始化的配置完全一致。
也可以进入Laravel容器执行php artisan tinker,然后运行DB::connection()->getPdo()测试连接是否正常,会直接抛出连接错误信息。Migration指向的数据库错误
如果你在.env里写错了DB_DATABASE,migrate会把表创建到错误的数据库中。可以执行php artisan migrate --pretend查看生成的SQL语句,确认目标数据库名称;或者进入MySQL容器,用SHOW DATABASES;列出所有库,逐个检查是否存在posts表。MySQL容器未就绪时执行了migrate
Docker-Compose的depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。如果Laravel容器先启动并执行migrate,此时MySQL还没初始化完成,migrate会静默失败(或报错但你没注意)。
解决办法:- 手动等待MySQL容器启动稳定(比如看容器日志显示
ready for connections)后,再进入Laravel容器执行php artisan migrate; - 在compose文件中给MySQL服务添加healthcheck,让Laravel容器等待MySQL就绪后再启动:
services: mysql: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 laravel: depends_on: mysql: condition: service_healthy
- 手动等待MySQL容器启动稳定(比如看容器日志显示
Laravel缓存了旧的配置
如果你修改过.env或config/database.php但没清除缓存,Laravel会继续使用旧配置。执行以下命令清除缓存:php artisan config:clear php artisan cache:clear之后再重新执行
php artisan migrate。MySQL8的加密方式不兼容Laravel5
Laravel5默认使用mysql_native_password认证方式,而MySQL8默认是caching_sha2_password,这会导致Laravel无法正常连接数据库(即使migrate命令没明显报错)。
进入MySQL容器执行以下命令修改用户认证方式:ALTER USER 'your_db_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_db_password'; FLUSH PRIVILEGES;替换
your_db_user和your_db_password为你.env里的配置。Migration文件存在问题
检查database/migrations目录下的create_posts_table文件,确认up方法里有正确的建表逻辑,比如:public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); }如果
up方法为空或语法错误,migrate不会创建表,此时执行migrate应该会有报错信息,注意查看终端输出。
内容的提问来源于stack exchange,提问作者sora sakamoto

