从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)的主要内容,如果未能解决你的问题,请参考以下文章
从 Spring Boot 应用程序连接到 mysql 容器