【问题标题】:Mysql connection refused in docker-composedocker-compose中的Mysql连接被拒绝
【发布时间】:2021-11-28 06:02:56
【问题描述】:

我在 docker-compose 中从我的 golang 应用程序连接到 MySQL 时遇到问题。我可以从控制台连接到数据库:mysql -u user -D data -h 0.0.0.0 -P3306 -p 但是,使用 docker-compose 时无法连接。

我的 docker-compose.yml

version: '3'

services:

  app:
    build: ./
    volumes:
      - ./internal/app:/app
      - ./logs:/var/log/parser
    links:
      - db

  db:
    image: mysql:8
    container_name: mysqldb
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/conf:/etc/mysql/conf/conf.d
      - ./docker/mysql/logs/:/var/log/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
      - ./docker/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: data
      MYSQL_USER: user
      MYSQL_PASSWORD: pass

在我的应用 main.go 中

    dbConfig := mysql.NewConfig()
    dbConfig.User = "user"
    dbConfig.Passwd = "pass"
    dbConfig.Addr = "mysqldb"
    dbConfig.DBName = "data"
    dbConfig.Net = "tcp"
    db, err := sql.Open("mysql", dbConfig.FormatDSN())
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

但我收到此错误:

panic: dial tcp 172.20.0.2:3306: connect: connection refused

【问题讨论】:

  • 运行脚本时,数据库是否完全启动?如果你运行docker-compose up,在应用程序错误之后是否有 MySQL 日志消息?如果你运行docker-compose up -d,等待30-60秒,再运行一次,会不会第二次启动?
  • 你的 mysql 配置文件中的bind-address 选项是什么?
  • 我认为golang服务在MySQL服务之前启动

标签: mysql docker go docker-compose


【解决方案1】:

我认为您的 golang 服务在 MySQL 服务之前启动。所以你必须先启动 MySQL 服务然后启动 golang 服务所以,使用depends_on 来实现。

带有depends_on的新docker-compose.yml

version: '3'

services:

  app:
    build: ./
    volumes:
      - ./internal/app:/app
      - ./logs:/var/log/parser
    depends_on:
      - mysqldb
    links:
      - db

  db:
    image: mysql:8
    container_name: mysqldb
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/conf:/etc/mysql/conf/conf.d
      - ./docker/mysql/logs/:/var/log/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
      - ./docker/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: data
      MYSQL_USER: user
      MYSQL_PASSWORD: pass

【讨论】:

  • 感谢您的回答,但不幸的是它没有帮助((
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 2019-06-06
  • 2018-10-23
  • 2021-10-12
  • 2017-08-05
  • 2020-09-08
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多