构建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-db127.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
相关产品推荐
相关产品推荐

