Laravel Sail:Docker容器内运行MySQL PHP迁移报错的解决咨询
解决Laravel Sail迁移时"Unknown database 'laravel'"错误
哎,这个问题我之前帮朋友排查过,核心就是你的MySQL容器里压根没创建名为laravel的数据库——虽然你在.env和docker-compose.yml里都配置了,但大概率是容器的持久化卷缓存或者启动顺序的问题,导致数据库没被正确初始化。下面一步步来搞定:
1. 先把配置调对
先核对下你的.env和docker-compose.yml的数据库配置,确保完全匹配且合理:
.env里的关键配置要改成这样:DB_CONNECTION=mysql DB_HOST=mysql # 直接用服务名就行,别写容器IP,Docker内部能通过服务名访问,IP重启会变 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=- 再确认
docker-compose.yml里的MySQL服务是引用.env变量来自动创建数据库的:mysql: image: 'mysql:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_DATABASE: '${DB_DATABASE}' # 这里会自动创建.env里指定的数据库 MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' volumes: - 'sailmysql:/var/lib/mysql'
2. 清理MySQL的持久化卷(最关键的一步)
Laravel Sail用sailmysql这个本地卷来保存MySQL的数据,如果之前你启动过容器但数据库没正确创建,卷里的旧数据会"记住"之前的状态,新的配置就不生效了。得把这个卷删掉重新初始化:
- 先停掉所有Sail容器:
./vendor/bin/sail down - 删除MySQL的持久化卷:
docker volume rm sailmysql - 重新启动容器(这次会根据
.env里的配置,自动创建laravel数据库):./vendor/bin/sail up -d
3. 验证数据库是否真的创建成功
容器启动后,进去MySQL容器里确认下:
./vendor/bin/sail exec mysql mysql -u root
进入MySQL命令行后,输入这条命令查看数据库列表:
SHOW DATABASES;
如果能看到laravel出现在列表里,那没问题了,直接跑迁移:
./vendor/bin/sail artisan migrate
4. 万一还是不行?
如果还是报错,看看MySQL容器的启动日志,有没有初始化时的错误提示:
./vendor/bin/sail logs mysql
日志里会告诉你具体哪里出问题,比如密码不符合要求(不过你这里是空密码,应该没问题),或者权限类的问题。
内容的提问来源于stack exchange,提问作者LaFllamme




