【问题标题】:Why connect to Google Cloud SQL failed inside Docker container but success outside Docker container?为什么在 Docker 容器内连接到 Google Cloud SQL 失败,但在 Docker 容器外连接成功?
【发布时间】:2017-07-16 22:48:37
【问题描述】:

我用 Golang 编写了一段代码来测试 Google Cloud SQL:

package main

import (
    "database/sql"
    "flag"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

var addr = flag.String("db", "", "The database address")

func main() {
    flag.Parse()

    db, err := sql.Open("mysql", *addr)
    if err != nil {
        fmt.Println("mysql open failed: ", err)
        return
    }

    defer db.Close()

    err = db.Ping()
    if err != nil {
        fmt.Println("mysql ping failed: ", err)
        return
    }
    fmt.Println("mysql ping success")
}

上面的代码我已经测试过了,输出是mysql ping success

然后我想在 Docker 容器中测试这个函数,Dockerfile如下:

FROM golang

ADD . $GOPATH/src/github.com/pdu/gcloud-sql-test

RUN go install github.com/pdu/gcloud-sql-test

ENTRYPOINT ["gcloud-sql-test"]
CMD ["-db=\"user:passwd@tcp(gcloud.sql.ip.address:3306)/database\""]

构建 Docker 映像并运行容器后,我得到以下输出: mysql ping 失败:错误 1045:用户 '"user'@'my.local.ip.address' 的访问被拒绝(使用密码:YES)

我已经配置了我的本地 IP 可以访问 Google Cloud SQL。我不知道为什么它不能在 Docker 容器内工作,但在 Docker 容器外工作。

更新,由于 Dockerfile 错误,我已经解决了这个问题

FROM golang

ADD . $GOPATH/src/github.com/pdu/gcloud-sql-test

RUN go install github.com/pdu/gcloud-sql-test

CMD ["gcloud-sql-test", "-db=user:passwd@tcp(gcloud.sql.ip.address:3306)/database"]

主要区别是去掉 Dockerfile:CMD 参数中的引号,而在终端执行程序时需要引号

【问题讨论】:

    标签: mysql go docker google-cloud-sql


    【解决方案1】:

    试试

    FROM golang
    
    ADD . $GOPATH/src/github.com/pdu/gcloud-sql-test
    
    RUN go install github.com/pdu/gcloud-sql-test
    
    CMD ["gcloud-sql-test","-db=\"user:passwd@tcp(gcloud.sql.ip.address:3306)/database\""]
    

    CMDENTRYPOINT 是不同的命令

    【讨论】:

    • 仍然被拒绝访问。
    • 我刚刚使用了与您建议的完全相同的 Dockerfile,但仍然被拒绝访问。我在想 Docker 容器是否有什么特别的东西可以验证 google-cloud-sql。
    • 我不知道该说什么,我之前没有使用过 google-cloud-sql,但是我在 docker 主机以外的其他主机上使用了数据库,我的方法对我有用
    • 也许 google-cloud-sql 身份验证有什么特别之处,我已经提出了支持票,当我收到 gcloud 的回复时会通知您
    • 谢谢!该链接有帮助,但我的情况有点不同,我仍在本地开发环境中。
    【解决方案2】:

    由于 Dockerfile 错误,我已经解决了这个问题

    FROM golang
    
    ADD . $GOPATH/src/github.com/pdu/gcloud-sql-test
    
    RUN go install github.com/pdu/gcloud-sql-test
    
    CMD ["gcloud-sql-test", "-db=user:passwd@tcp(gcloud.sql.ip.address:3306)/database"]
    

    主要区别是去掉 Dockerfile:CMD 参数中的引号,而在终端执行程序时需要引号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 2018-11-22
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2015-12-10
      • 1970-01-01
      相关资源
      最近更新 更多