我尝试使用 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
并收到此错误:
Attaching to dnz-database, dnz-api dnz-api | 2017/11/05 10:23:46 dial tcp 172.21.0.2:5432: getsockopt: connection refused dnz-api | exit status 1 dnz-api exited with code 1
我做错了什么?
最佳答案
您无法连接到您的 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最新图片。
关于postgresql - 连接时 Gorm + Docker 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120505/