从golang mysql连接到mysql容器时,用户'root'@'localhost'的访问被拒绝(使用密码:YES)

Posted

技术标签:

【中文标题】从golang mysql连接到mysql容器时,用户\'root\'@\'localhost\'的访问被拒绝(使用密码:YES)【英文标题】:Access denied for user 'root'@'localhost' (using password: YES) when connecting from golang mysql to mysql container从golang mysql连接到mysql容器时,用户'root'@'localhost'的访问被拒绝(使用密码:YES) 【发布时间】:2022-01-18 21:24:35 【问题描述】:

我有 2 个容器,一个用于我的应用程序中的主要逻辑,另一个用于 mysql 数据库。这是 docker-compose 文件

version: '3'
services:
    database:
        image: mysql
        container_name: mysql-db
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        env_file:
          - environment-variables.env
        ports:
          - 3306:3306
    logic:
        container_name: main-logic
        build: ./logic/.

逻辑在 golang 中,我正在尝试连接到数据库。这是 go 代码。

    err := godotenv.Load("/environment-variables.env")
    if err != nil 
        log.Fatalln("Error in fetching environment variables", err)
    
    dataSourceName := fmt.Sprint("root:", os.Getenv("MYSQL_ROOT_PASSWORD"), "@tcp(docker.for.mac.localhost:3306)/some-db")
    log.Println(dataSourceName)
    db, err := sql.Open("mysql", dataSourceName)
    if err != nil 
        log.Fatalln("Some error in connecting to the database in the method", err)
    
    db.SetMaxOpenConns(1)
    err = db.Ping()
    log.Println("Error is", err.Error())
    defer db.Close()

环境变量文件里面是

MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=some-db

当我尝试连接时,我总是收到错误:

Error is Error 1045: Access denied for user 'root'@'localhost' (using password: YES)

如何解决?

【问题讨论】:

我知道你在哪里为 mysql 设置了MYSQL_ROOT_PASSSWORD,但你是为logic 服务设置它吗?顺便说一下mysql镜像支持自动创建非root用户;这将优于使用 root hub.docker.com/_/mysql @DanielFarrell,我不明白为逻辑服务设置密码。逻辑服务基本上是golang代码。因此,当建立连接时,dataSourceName 将包含密码权。此外,根据文档,它说设置 MYSQL_ROOT_PASSWORD 将使其成为 root 的默认密码,这就是我正在做的事情 你提到的“环境变量文件”是什么? os.Getenv 不读取任何文件。 我编辑了代码。之前在函数中忘记添加了 @twothreezarsix os.Getenv("MYSQL_ROOT_PASSWORD") 用于构建 dsn。 os.Getenv 为未设置的环境变量返回空字符串。如果您没有为logic 服务设置MYSQL_ROOT_PASSWORD,它将使用空字符串作为密码。 【参考方案1】:

这是我犯的错误。 首先,由于数据库和主逻辑都在容器中,这意味着主逻辑从 docker 为其创建的网络而不是 localhost 访问数据库。这是 database:3306 而不是 docker.for.mac.localhost。

其次,更重要的是,应该等待数据库准备好接受连接。这应该通过健康检查来完成。否则数据库将始终拒绝连接。

以下是一些有用的答案链接:

第 1 点:panic: dial tcp 127.0.0.1:3306: connect: connection refused

第 2 点:https://***.com/a/42757250/10740241

【讨论】:

以上是关于从golang mysql连接到mysql容器时,用户'root'@'localhost'的访问被拒绝(使用密码:YES)的主要内容,如果未能解决你的问题,请参考以下文章

元数据库未连接到 MySQL(docker 容器)

从主机连接到 docker 容器中的 mysql

如何从 docker 容器连接到远程 mysql 托管?

从 Spring Boot 应用程序连接到 mysql 容器

Python Flask SQLAlchemy 容器无法连接到 MySQL 容器

无法从 docker 容器连接到 Localhost Mysql