我尝试使用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拨号 tcp 172.21.0.2:5432:getsockopt:连接被拒绝dnz-api |出口 状态1 dnz-api退出代码1
我做错了什么?
答案 0 :(得分:2)
您无法连接到psql
容器,因为您尚未将其链接。看看Docker-Compose documentation on links。
另外,我假设您没有安排容器启动订单。 Psql
容器必须在golang
之前启动。看看Docker Compose documentation on startup order。您可以使用wait-for-it来实现文档中所述的目标。只需wget
即可将其保存在项目中。
我不知道你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
以指出您需要的任何路径。我已使用/go/src/github.com/pavel/gorm-psql
设置标准版。我假设您创建了一个名为dnz-dev
的数据库,如果名称不同,则只需编辑它。
$ go env:
. . .
GOPATH="/home/pavel/go"
GOROOT="/usr/lib/go"
. . .
只需运行docker-compose up
,就可以了。我依赖postgresql和golang最新图片。