为什么连接到Google Cloud SQL在Docker容器中失败但在Docker容器外成功?

时间:2017-02-26 09:33:10

标签: mysql go docker google-cloud-sql

我在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'拒绝访问(使用密码:是)

我已经配置我的本地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参数中的引号,而在从终端执行程序时需要引号

2 个答案:

答案 0 :(得分:0)

尝试

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是不同的命令

答案 1 :(得分:0)

由于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参数中的引号,而在从终端执行程序时需要引号