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

我在Golang写了一段代码来testingGoogle 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") } 

我已经testing了上面的代码,输出是mysql ping成功

然后我想在Docker容器里面testing这个函数, 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\""] 

build立Docker镜像后,运行容器,得到如下输出结果: mysql ping failed:Error 1045:Access denied for user'“user'@my.local.ip.address'(using password:YES)

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

尝试

 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\""] 

CMD和ENTRYPOINT是不同的命令

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