我一直在尝试将golang容器与mysql容器连接近5天,每次我遇到有关“连接被拒绝”问题的问题时,我都添加了等待,以便golang容器在Mysql容器准备时等待连接...但是在 docker 文件和 docker compose 文件中添加 Wait 命令并不能解决任何问题。这是我的Go MySQL连接代码func init() { // loaDerr := godotenv.Load() // if loaDerr != nil { // log.Fatal("Error loading .env file") // } username := os.Getenv("MYSQL_USER") password := os.Getenv("MYSQL_ROOT_PASSWORD") host := os.Getenv("WAIT_HOSTS") port := os.Getenv("MYSQL_PORT") schema := os.Getenv("MYSQL_DATABASE") fmt.Println(username, password, host, port, schema) dataSourceName := fmt.Sprintf( "%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, // port, schema, ) var err error //connect to the database server client, err = sql.Open("mysql", dataSourceName) if err != nil { panic(err) } //checking the connection if connectionErr := client.Ping(); connectionErr != nil { panic(connectionErr.Error()) } fmt.Println("Database connection is been established succesfully")}请帮帮我,我已经尝试了所有的组合,但它不起作用,如果我将mysql工作台与正在运行的mysql容器连接,它连接正常,不会给出任何错误,但与docker和golang进行连接,它会给我一个错误谢谢
3 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
每当在容器之间建立连接时,Docker 都会使用服务侦听的“正常”端口。如果您要连接到MySQL或MariaDB容器,则它始终使用端口3306; 对于这种情况不是必需的,如果是,则忽略它们。ports:
services: bucket-mysql: image: mysql:latest # neither expose: nor ports: are required bucket: build: . environment: WAIT_HOSTS: bucket-mysql:3306 # ignores ports: remapping MYSQL_HOST: bucket-mysql # MYSQL_PORT: "3306" # this is the default port
(expose:
在现代Docker中几乎不做任何事情,删除它是安全的;如果您确实拥有它,则端口号是容器内的端口号,并且映像已在其 Dockerfile 中。您还可以安全地依赖 Compose 的默认值 、 和构建的名称,此外,您通常不需要覆盖 Dockerfile 为其 指定的内容。这可能有助于简化文件。mysql
EXPOSE 3306
networks:
container_name:
image:
command:
CMD
docker-compose.yml
慕码人2483693
TA贡献1860条经验 获得超9个赞
在 DSN 中,您没有设置端口,该端口已从默认的 3306 -> 3305 更改为docker-compose
fmt.Println(username, password, host, port, schema) dataSourceName := fmt.Sprintf( "%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, schema, )
将端口添加到 DSN
fmt.Println(username, password, host, port, schema) dataSourceName := fmt.Sprintf( "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port schema, )
饮歌长啸
TA贡献1951条经验 获得超3个赞
看看您的设置:
WAIT_HOSTS: bucket-mysql:3305
您在GO应用程序中使用相同的应用程序,它应该是3306!
3305 是它在主机上运行的端口
- 3 回答
- 0 关注
- 208 浏览
添加回答
举报
0/150
提交
取消