Laravel应用Docker容器内无法连接MySQL数据库求助
问题排查与修复方案
1. MySQL初始化脚本路径错误
你的docker-compose.yml中,db服务的初始化脚本挂载路径写错了——官方MySQL镜像的初始化目录是/docker-entrypoint-initdb.d/,你漏掉了中间的横杠,导致SQL脚本不会被执行,数据库无法完成初始化。
2. MySQL环境变量配置错误
MYSQL_ROOT不是MySQL官方镜像的有效环境变量,该配置无意义,直接删除即可(你已设置MYSQL_ALLOW_EMPTY_PASSWORD: "true",无需额外配置root账号相关变量)。
3. Laravel容器卷挂载无效
当前main服务的卷配置- /test/var/www/html是匿名卷,不会同步本地代码到容器内的/app工作目录,导致容器内代码可能不是最新版本,且本地代码修改无法同步到容器。
4. 未等待MySQL服务就绪
depends_on仅保证容器启动顺序,不会等待MySQL服务完全就绪,Laravel容器启动后可能尝试连接未就绪的MySQL,直接触发连接错误。
修正后的配置文件
docker-compose.yml
version: '3.8' services: main: build: context: . dockerfile: Dockerfile command: 'php artisan serve --host=0.0.0.0' volumes: - ./:/app # 同步本地代码到容器工作目录 ports: - 8000:8000 depends_on: db: condition: service_healthy # 等待MySQL健康检查通过后启动 db: image: mysql:8.0 environment: MYSQL_DATABASE: employee_app MYSQL_ALLOW_EMPTY_PASSWORD: "true" volumes: - /db_dumps/employee_app.sql:/docker-entrypoint-initdb.d/employee_app.sql # 修正初始化目录路径 - db_data:/var/lib/mysql # 添加持久化卷,防止数据丢失 ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 volumes: db_data: # 定义持久化卷
Dockerfile
FROM php:8.0-fpm-alpine RUN docker-php-ext-install pdo pdo_mysql sockets # 仅保留从官方镜像复制composer,避免重复安装导致冲突 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /app COPY . . RUN composer install --ignore-platform-reqs
操作步骤
- 清理旧容器与卷:
docker-compose down -v
- 重新构建并启动容器:
docker-compose up --build
- 查看MySQL容器日志,确认初始化脚本执行成功:
docker-compose logs db
内容的提问来源于stack exchange,提问作者Filip Kupczyk
相关产品推荐
相关产品推荐

