连接时Gorm + Docker错误

我试图用Docker连接到我的postgresql数据库:

package main import ( "fmt" "log" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/postgres" ) type Product struct { gorm.Model Code string Price uint } var db *gorm.DB func init() { connection := fmt.Sprintf("host=db sslmode=disable user=dnz-dev password=dnz-dev") db, err := gorm.Open("postgres", connection) if err != nil { log.Fatalln(err) } defer db.Close() } func main() { // Migrate the schema db.AutoMigrate(&Product{}) } 

docker-compose

版本:“3.3”

 services: db: build: ./dnz-db container_name: dnz-database ports: - "6000:5432" volumes: - ./dnz-db/data:/var/lib/postgresql/data environment: - POSTGRES_USER=dnz-dev - POSTGRES_PASSWORD=dnz-dev api: build: ./dnz-api container_name: dnz-api volumes: - ./dnz-api:/go/src/app ports: - "5000:3000" depends_on: - db 

我运行docker-compose up --build ,我得到这个错误:

附加到dnz-database,dnz-api dnz-api | 2017/11/05 10:23:46 dial tcp 172.21.0.2:5432:getsockopt:连接拒绝dnz-api | 退出状态1 dnz-api用代码1退出

我做错了什么?

您无法连接到您的psql容器,因为您没有链接它。 查看链接上的Docker-Compose文档 。

另外,我假设你没有安排你的容器启动顺序。 Psql容器必须在golang之前启动。 查看启动顺序的Docker Compose文档 。 您可以使用等待来实现文档中陈述的客观条件。 只需将其保存并保存在您的项目中。

我不知道你的Dockerfile的内容,但我会认为它是这样的:

 FROM golang:1.9 RUN mkdir -p /go/src/github.com/pavel/gorm-psql WORKDIR /go/src/github.com/pavel/gorm-psql ADD . /go/src/github.com/pavel/gorm-psql RUN go get -v 

所以,你应该编辑你docker-compose.yml ,首先运行wait-for-it.sh并将psql容器连接到你的应用程序,如下所示:

 version: '3.3' services: db: image: postgres environment: POSTGRES_DB: dnz-dev POSTGRES_USER: dnz-dev POSTGRES_PASSWORD: dnz-dev ports: - 6000:5432 api: build: . command: ["./wait-for-it.sh", "db:6000", "--", "go", "run", "main.go"] volumes: - .:/go/src/github.com/pavel/gorm-psql ports: - "5000:3080" depends_on: - db links: - db 

如果你的main有另一个名字只是改变它。 编辑您的volumes ,指出您需要的任何path。 我用/go/src/github.com/pavel/gorm-psql设置了一个标准的。 我假设你创build了一个名为dnz-dev的数据库,如果名称不同,就编辑它。

 $ go env: . . . GOPATH="/home/pavel/go" GOROOT="/usr/lib/go" . . . 

只需运行docker-compose up ,它应该工作得很好。 我依靠postgresql和golang最新的图像。