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

Go API容器连接MySQL容器持续出现lookup重试错误,求解决方案

问题解决:Golang API容器无法连接MySQL容器(dial tcp: lookup db-mysql: Try again)

问题描述

部署了两个Docker容器:基于Golang的API服务容器,以及MySQL数据库容器。两者均可正常启动,但API尝试连接MySQL时持续抛出错误:panic: dial tcp: lookup db-mysql: Try again。添加重试逻辑能临时成功,但全量适配重试成本过高,需定位根源并彻底解决。

核心根源分析

  1. 容器网络隔离:你的docker-compose.yml中,MySQL容器(db服务)加入了自定义网络mysql-net,但API容器(app服务)未配置网络参数,默认会加入Docker Compose自动创建的项目默认网络。两个容器处于不同网络,无法通过服务名/容器名进行DNS解析。
  2. depends_on的局限性:depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪——这也是重试能临时生效的原因,但网络不通才是导致解析失败的根本问题。

解决方案

1. 让API容器加入同一网络

修改docker-compose.yml,给app服务添加networks配置,使其和MySQL容器共用mysql-net网络:

version: '3.3'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: api
    ports:
      - "8080:8080"
    env_file:
      - .env
    depends_on:
      - db
    command: ["/app/main"]
    networks:  # 新增网络配置
      - mysql-net
  db:
    image: mysql:5.7
    container_name: db-mysql
    restart: always
    env_file:
      - .env
    networks:
      - mysql-net
    ports:
      - "3306:3306"
    expose:
      - 3306
    volumes:
      - my-db:/var/lib/mysql
      - ./init:/docker-entrypoint-initdb.d/

networks:
  mysql-net:
    driver:  bridge

volumes:
  my-db:

2. 修正数据库连接地址

确保代码/.env中的数据库主机使用Docker Compose的服务名db(而非容器名db-mysql),因为Docker网络中默认以服务名为DNS别名。例如.env中的配置:

DB_HOST=db
DB_PORT=3306

3. 可选:添加MySQL就绪检测(消除启动时序问题)

为db服务添加健康检查,确保API仅在MySQL完全就绪后启动,彻底消除重试需求:

db:
  image: mysql:5.7
  container_name: db-mysql
  restart: always
  env_file:
    - .env
  networks:
    - mysql-net
  ports:
    - "3306:3306"
  expose:
    - 3306
  volumes:
    - my-db:/var/lib/mysql
    - ./init:/docker-entrypoint-initdb.d/
  healthcheck:  # 新增健康检查
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${DB_USER}", "-p${DB_PASSWORD}"]
    interval: 5s
    timeout: 5s
    retries: 5

# 同时修改app服务的depends_on
app:
  # ... 其他配置
  depends_on:
    db:
      condition: service_healthy  # 等待MySQL健康检查通过

验证步骤

  1. 重启容器:
docker-compose down && docker-compose up --build
  1. 检查API容器所在网络:
docker inspect api | grep Networks

确认输出中包含mysql-net。
3. 测试API服务,验证数据库连接是否正常,无解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:01:34