【发布时间】: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