Perché connettersi a Google Cloud SQL non riuscito all'interno del contenitore Docker ma il successo al di fuori del contenitore Docker?

Ho scritto un pezzo di codice a Golang per testare 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") } 

Ho provato il codice di cui sopra, l'output è mysql ping successo

Poi voglio provare questa function all'interno del contenitore Docker, il Dockerfile che segue:

 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:[email protected](gcloud.sql.ip.address:3306)/database\""] 

Dopo aver costruito l'image Docker ed eseguito il contenitore, ho ottenuto l'output seguente: mysql ping non riuscito: Errore 1045: accesso negato per utente "user'@'my.local.ip.address" (utilizzando password: SI)

Ho già configurato che il mio IP locale può accedere a Google Cloud SQL. Non so perché non funziona all'interno del contenitore Docker ma funziona al di fuori del contenitore Docker.

Aggiornamenti, ho risolto il problema a causa dell'errore 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:[email protected](gcloud.sql.ip.address:3306)/database"] 

La differenza principale è quella di rimuovere il segno di virgolette nel parametro Dockerfile: CMD, mentre è necessario il preventsvo quando si esegue il programma da Terminal.

Provare

 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:[email protected](gcloud.sql.ip.address:3306)/database\""] 

CMD e ENTRYPOINT sono comandi diversi

Ho risolto il problema a causa dell'errore 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:[email protected](gcloud.sql.ip.address:3306)/database"] 

La differenza principale è quella di rimuovere il segno di virgolette nel parametro Dockerfile: CMD, mentre è necessario il preventsvo quando si esegue il programma da Terminal.