You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建Docker镜像时遇Unsupported driver[]错误求助(Laravel+MySQL)

Laravel容器化构建镜像报错:Unsupported driver []

错误日志

Illuminate\Foundation\ComposerScripts::postAutoloadDump
#0 19.78 > @php artisan package:discover
    #0 19.86 In ConnectionFactory.php line 44:
    #0 19.86
    #0 19.86   Unsupported driver []
    #0 19.86
    #0 19.86
    #0 19.86 Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

当前配置文件

Dockerfile

FROM php:7.3-apache
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

COPY src/ /var/www/html/

RUN apt-get update
RUN apt-get install -y libzip-dev openssl zip unzip git
RUN docker-php-ext-install zip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo mbstring
RUN composer self-update

ENV COMPOSER_ALLOW_SUPERUSER=1

RUN composer install

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

docker-compose.yml

version: '3.5'

services:
  laravel-app:
    build:
      context: '.'
      args:
        uid: ${UID}
    container_name: laravel-app
    ports:
      - 8000:80
    environment:
      - APACHE_RUN_USER=#1000
      - APACHE_RUN_GROUP=#1000
    volumes:
      - .:/var/www/html
    networks:
      backend:
        aliases:
          - app

  mysql-db:
    image: mysql:5.7
    container_name: mysql-db
    volumes:
      - ./run/var:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxx
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
    networks:
      backend:
        aliases:
          - mysql-db

networks:
  backend:
    name: backend-network

.env

APP_NAME="myapp"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

SESSION_SECURE_COOKIE=true

LOG_CHANNEL=stack

#admin
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE="xxx"
DB_USERNAME="xxx"
DB_PASSWORD="xxx"

#feeds
FEEDS_DB_DRIVER=mysql
FEEDS_DB_HOST=127.0.0.1
FEEDS_DB_PORT=3306
FEEDS_DB_DATABASE="xxx"
FEEDS_DB_USERNAME="xxx"
FEEDS_DB_PASSWORD="xxx"

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=xx
REDIS_PORT=xxxx

MAIL_DRIVER=smtp
MAIL_HOST=xxxx
MAIL_PORT=xxx
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

database.php

<?php

return [

  
    'default' => env('DB_CONNECTION', 'admin'),

    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */

    'connections' => [

        'admin' => [
            'driver' => env('DB_DRIVER'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        'feeds' => [
            'driver' => env('FEEDS_DB_DRIVER'),
            'host' => env('FEEDS_DB_HOST', ''),
            'port' => env('FEEDS_DB_PORT', ''),
            'database' => env('FEEDS_DB_DATABASE'),
            'username' => env('FEEDS_DB_USERNAME', ''),
            'password' => env('FEEDS_DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

修复方案

1. 安装PDO MySQL扩展

修改Dockerfile中扩展安装命令,添加pdo_mysql:

RUN docker-php-ext-install pdo pdo_mysql mbstring

PHP需要该扩展才能识别MySQL驱动,否则会提示驱动不支持。

2. 跳过构建阶段的数据库初始化脚本

构建镜像时执行composer install会触发post-autoload-dump事件,进而运行artisan package:discover,此时MySQL容器还未启动,易导致数据库连接失败。修改composer install命令,跳过脚本执行:

RUN composer install --no-scripts

然后在容器启动时再执行这些脚本,更新CMD:

CMD composer run-script post-autoload-dump && php artisan serve --host=0.0.0.0 --port=8181

3. 修正数据库连接配置

  • 在.env文件中添加DB_CONNECTION=admin,确保Laravel能正确读取默认连接:
    DB_CONNECTION=admin
    
  • 将数据库主机改为Docker Compose网络中的容器别名,替换.env里的DB_HOST和FEEDS_DB_HOST:
    DB_HOST=mysql-db
    FEEDS_DB_HOST=mysql-db
    
    容器内的127.0.0.1指向自身,无法访问外部MySQL容器,使用别名可通过Docker网络直接访问。

4. 调整Docker Compose启动顺序

在laravel-app服务中添加depends_on,确保MySQL容器先启动:

services:
  laravel-app:
    ...
    depends_on:
      - mysql-db

注:depends_on仅保证启动顺序,不保证MySQL完全就绪,开发环境足够使用,生产环境可添加健康检查机制。

内容的提问来源于stack exchange,提问作者shk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:47:02