猿问

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

我一直在尝试将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进行连接,它会给我一个错误谢谢


扬帆大鱼
浏览 262回答 3
3回答

芜湖不芜

每当在容器之间建立连接时,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

慕码人2483693

在 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,     )

饮歌长啸

看看您的设置:WAIT_HOSTS: bucket-mysql:3305您在GO应用程序中使用相同的应用程序,它应该是3306!3305 是它在主机上运行的端口
随时随地看视频慕课网APP

相关分类

Go
我要回答