Symfony6+Docker环境下API Platform与命令行数据库连接冲突问题
问题描述
在Docker环境运行Symfony 6 + PHP 8项目,使用API Platform发起GET请求时出现错误:
"An exception occurred in the driver: SQLSTATE[HY000] [2002] No such file or directory in . (which is being imported from "/app/config/routes/api_platform.yaml"). Make sure there is a loader supporting the "api_platform" type."
排查中尝试将实体注解改为属性、添加getter/setter、修改DATABASE_URL添加版本信息均无效,随后发现:
- 用Docker Compose数据库服务名配置
DATABASE_URL时,API Platform可正常访问:DATABASE_URL="mysql://admin@database:3306/databasetest" - 本地执行Symfony命令(如
php bin/console make:migration)时,必须切换为另一个配置:DATABASE_URL="mysql://admin@localhost:3307/databasetest"
两种配置无法同时满足API平台运行和本地命令行操作需求,需找到兼容方案。
项目的docker-compose.yml数据库服务配置如下:
services: database: ports: - '3307:3306'
兼容解决方案
方案1:用环境变量文件区分容器与本地环境
在项目根目录创建两个环境配置文件:
.env.docker:供容器内API Platform使用DATABASE_URL="mysql://admin@database:3306/databasetest".env.local:供本地执行Symfony命令使用DATABASE_URL="mysql://admin@localhost:3307/databasetest"
修改docker-compose.yml,指定PHP/Symfony服务加载.env.docker:
services: php: # 你的Symfony服务名称 env_file: - .env.docker - .env # 保留基础环境变量
Symfony会自动优先加载本地的.env.local,容器内则使用.env.docker,无需手动切换配置。
方案2:通过hosts映射实现统一配置
修改本地系统hosts文件(Windows路径:C:\Windows\System32\drivers\etc\hosts;Linux/macOS路径:/etc/hosts),添加一行映射:
127.0.0.1 database
之后容器和本地可共用同一份DATABASE_URL配置:
- 容器内通过Docker网络直接访问
database:3306 - 本地访问
database:3307(对应Docker映射的端口)
方案3:直接通过Docker执行本地命令
放弃在本地直接运行Symfony命令,改为通过Docker容器执行:
docker-compose exec php php bin/console make:migration
命令在PHP容器内运行,直接使用容器内的DATABASE_URL配置,无需维护多套环境变量。
总结
- 偏好本地执行命令:方案1(环境文件区分)或方案2(hosts映射)更适合;
- 习惯Docker工作流:方案3最省心,无需切换配置。
内容的提问来源于stack exchange,提问作者GrowyTobe

