You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,
      });
      

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容器提前发起连接,会触发连接失败。
    • 解决方式:
      1. 在Node应用中添加重连机制:
        async function connectDB() {
          try {
            await AppDataSource.initialize();
            console.log("数据库连接成功");
          } catch (error) {
            console.error("数据库连接失败:", error);
            // 3秒后重试
            setTimeout(connectDB, 3000);
          }
        }
        connectDB();
        
      2. 使用wait-for-it工具等待MySQL服务就绪后启动Node容器:
        在docker-compose.yml中修改app服务的启动命令(需在Dockerfile中安装该脚本):
        app:
          build: .
          command: ["./wait-for-it.sh", "mysql:3306", "--", "npm", "start"]
          depends_on:
            - mysql
        

5. 验证容器网络连通性

  • 进入Node容器,手动ping MySQL服务名测试DNS解析:
    docker exec -it <node容器名称> ping mysql
    
  • 若ping不通,重启docker-compose重置网络:
    docker-compose down
    docker-compose up --build
    

内容的提问来源于stack exchange,提问作者MohamedSalah97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:30:57