Laravel 8 Sail项目如何在docker-compose.yml中将MySQL从8.0切换为5.6/5.7
问题根本原因
你之前运行MySQL 8.0时已经生成了名为sailmysql的持久化存储卷,卷内的数据库文件是MySQL 8.0的存储格式,与MySQL 5.7不兼容,这是导致容器启动失败返回Exit 2的核心原因。
解决方案步骤
- 第一步:删除旧的MySQL持久化卷
先停止正在运行的容器,执行命令:
加sail down -v-v参数会同时删除关联的sailmysql存储卷,注意:该操作会清空你之前在MySQL 8.0容器中存储的所有数据库数据,若有需要请提前备份。 - 第二步:调整MySQL配置适配5.7版本
你当前的配置里MYSQL_ALLOW_EMPTY_PASSWORD参数在部分MySQL 5.7镜像版本中可能会触发校验问题,建议修改为如下配置:mysql: image: 'mysql:5.7' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' volumes: - 'sailmysql:/var/lib/mysql' networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s - 第三步:重新启动容器
执行命令重建容器和存储卷:
启动完成后执行sail up -ddocker-compose ps即可看到MySQL 5.7容器正常运行。
额外注意事项
- 你同步修改了PHP版本为7.3,需要确认你的Laravel 8版本兼容PHP 7.3:Laravel 8最小支持PHP 7.3,只要你的项目没有安装依赖PHP 8+的第三方扩展即可正常运行。
- 如果删除旧卷后仍然启动失败,可以执行
docker logs <mysql容器名>查看具体报错日志,排查是否为.env中数据库密码不符合MySQL 5.7的密码规则导致的初始化失败。
内容的提问来源于stack exchange,提问作者Sasha Phantomas
相关产品推荐
相关产品推荐

