Docker Compose下TypeORM连接MySQL容器报EAI_AGAIN错误求助
解决TypeORM连接Docker MySQL容器时的
Error: getaddrinfo EAI_AGAIN mysql问题 1. 确认Docker Compose网络配置
- 确保Node与MySQL容器处于同一Docker网络。默认情况下,docker-compose会自动创建专属网络,所有服务可通过服务名直接访问。
- 检查
docker-compose.yml,避免手动给两个服务指定不同网络:version: '3.8' services: app: build: . depends_on: - mysql # 无需手动配置network,默认与mysql同属一个网络 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} - 若手动配置了网络,需确保两个服务都加入该网络:
networks: app-network: driver: bridge services: app: # 其他配置 networks: - app-network mysql: # 其他配置 networks: - app-network
- 检查
2. 修正TypeORM的数据库主机配置
- TypeORM配置中的
host必须设为Docker Compose里MySQL服务的服务名(默认是mysql,若服务名修改需同步调整),不能用localhost或127.0.0.1——Node容器内的localhost指向自身,而非MySQL容器。- 示例TypeORM数据源配置(
data-source.ts):import { DataSource } from "typeorm"; import dotenv from "dotenv"; dotenv.config(); export const AppDataSource = new DataSource({ type: "mysql", host: process.env.DB_HOST || "mysql", port: parseInt(process.env.DB_PORT || "3306"), username: process.env.DB_USER || "root", password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: ["src/entities/**/*.ts"], synchronize: true, logging: false, });
- 示例TypeORM数据源配置(
3. 检查.env文件变量正确性
- 确保
.env文件中DB_HOST值为MySQL服务名(如mysql),而非localhost:DB_HOST=mysql DB_PORT=3306 DB_USER=root DB_PASSWORD=your_password DB_NAME=your_db_name - 确认Node容器已正确挂载
.env文件,可在docker-compose.yml中添加挂载配置:app: build: . volumes: - .env:/app/.env
4. 处理MySQL容器启动延迟问题
depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。若Node容器提前发起连接,会触发连接失败。- 解决方式:
- 在Node应用中添加重连机制:
async function connectDB() { try { await AppDataSource.initialize(); console.log("数据库连接成功"); } catch (error) { console.error("数据库连接失败:", error); // 3秒后重试 setTimeout(connectDB, 3000); } } connectDB(); - 使用
wait-for-it工具等待MySQL服务就绪后启动Node容器:
在docker-compose.yml中修改app服务的启动命令(需在Dockerfile中安装该脚本):app: build: . command: ["./wait-for-it.sh", "mysql:3306", "--", "npm", "start"] depends_on: - mysql
- 在Node应用中添加重连机制:
- 解决方式:
5. 验证容器网络连通性
- 进入Node容器,手动ping MySQL服务名测试DNS解析:
docker exec -it <node容器名称> ping mysql - 若ping不通,重启docker-compose重置网络:
docker-compose down docker-compose up --build
内容的提问来源于stack exchange,提问作者MohamedSalah97
相关产品推荐
相关产品推荐

