Docker环境下Laravel数据库迁移失败的排查解决求助
Docker+Laravel迁移报错:SQLSTATE[HY000] [2002] 主机名无法解析
问题背景
所有Docker容器已正常启动,但执行php artisan migrate命令时出现数据库连接错误,错误提示无法解析主机名database。相关配置信息如下:
docker-compose.yml
services: laravel: restart: unless-stopped container_name: laravelapp build: context: ../ dockerfile: ./deploy/Dockerfile volumes: - ../:/var/www/html - ../storage/app:/var/www/html/storage/app environment: APP_NAME: ${APP_NAME} APP_ENV: ${APP_ENV} APP_DEBUG: ${APP_DEBUG} APP_KEY: ${APP_KEY} APP_VERSION: ${APP_VERSION} APP_URL: ${APP_URL} DB_CONNECTION: mysql DB_HOST: mysql DB_DATABASE: ${DB_DATABASE} DB_USERNAME: ${DB_USERNAME} DB_PASSWORD: ${DB_PASSWORD} MAIL_MAILER: ${MAIL_MAILER} MAIL_HOST: ${MAIL_HOST} MAIL_PORT: ${MAIL_PORT} MAIL_USERNAME: ${MAIL_USERNAME} MAIL_PASSWORD: ${MAIL_PASSWORD} MAIL_ENCRYPTION: ${MAIL_ENCRYPTION} MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS} MAIL_FROM_NAME: ${MAIL_FROM_NAME} ports: - "8080:80" networks: - n-laravel depends_on: - mysql mysql: restart: unless-stopped image: mysql:8.0 volumes: - v-mysql:/var/lib/mysql environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} networks: - n-laravel ports: - 3307:3306
.env文件
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3307 DB_DATABASE=shitdate DB_USERNAME=admin DB_PASSWORD=password DB_ROOT_PASSWORD=root
错误信息
/var/www/html # php artisan migrate Illuminate\Database\QueryException Illuminate\Database\QueryException Illuminate\Database\QueryException SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for database failed: Name does not resolve (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for database failed: Name does not resolve (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'shitdate' and table_type in ('BASE TABLE', ' as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'shitdate' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name) SYSTEM VERSIONED') order by table_name) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:825 at vendor/laravel/framework/src/Illuminate/Database/Connection.php:825 821▕ $this->getName(), $query, $this->prepareBindings($bindings), $e 822▕ ); 821▕ $this->getName(), $query, $this->prepareBindings($bindings), $e 822▕ ); 823▕ } 823▕ } 824▕ ➜ 825▕ throw new QueryException( 824▕ ➜ 825▕ throw new QueryException( 826▕ $this->getName(), $query, $this->prepareBindings($bindings), $e 827▕ ); 828▕ } 829▕ } 826▕ $this->getName(), $query, $this->prepareBindings($bindings), $e 827▕ ); 828▕ } 829▕ } 827▕ ); 828▕ } 829▕ } 829▕ } +41 vendor frames 42 artisan:13 Illuminate\Foundation\Application::handleCommand(Object(Symfony\Component\Console\Input\ArgvInput))
解决方案
1. 检查Laravel数据库配置文件
打开config/database.php,确认mysql连接的host字段是读取环境变量,而非硬编码值:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), // 确保此处为env('DB_HOST', ...),而非硬编码的'database' 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), // 其他配置项... ],
若此处写死'host' => 'database',会导致Laravel忽略.env配置,尝试解析错误的主机名。
2. 修正数据库端口配置
容器间通信使用容器内部端口,而非宿主机映射端口。mysql容器内部端口为3306,修改.env文件:
DB_PORT=3306
3. 清理Laravel配置缓存
若之前生成过配置缓存,需清除缓存以加载新配置:
# 进入laravel容器内部 docker exec -it laravelapp bash # 执行清理命令 php artisan config:clear
4. 在容器内部执行迁移命令
确保php artisan migrate在laravel容器内执行,而非宿主机(宿主机环境未配置正确的数据库连接):
docker exec -it laravelapp php artisan migrate
5. 验证数据库权限(可选)
确认admin用户拥有shitdate数据库的全部权限:
# 进入mysql容器 docker exec -it <mysql容器名> mysql -u root -p # 输入root密码后执行SQL GRANT ALL PRIVILEGES ON shitdate.* TO 'admin'@'%'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者JayVch
相关产品推荐
相关产品推荐

