为了账号安全,请及时绑定邮箱和手机立即绑定

我无法使用 docker-compose 从服务器容器连接 mysql 容器

我无法使用 docker-compose 从服务器容器连接 mysql 容器

Go
扬帆大鱼 2022-08-09 16:54:13
我一直在尝试将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 为其 指定的内容。这可能有助于简化文件。mysqlEXPOSE 3306networks:container_name:image:command:CMDdocker-compose.yml


查看完整回答
反对 回复 2022-08-09
?
慕码人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,
    )


查看完整回答
反对 回复 2022-08-09
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

看看您的设置:

WAIT_HOSTS: bucket-mysql:3305

您在GO应用程序中使用相同的应用程序,它应该是3306!

3305 是它在主机上运行的端口


查看完整回答
反对 回复 2022-08-09
  • 3 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信