连接时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最新的图像。