postgresql - 连接时 Gorm + Docker 错误

标签 postgresql docker go go-gorm

我尝试使用 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 就可以正常工作。我依靠 postgresqlgolang最新图片。

关于postgresql - 连接时 Gorm + Docker 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120505/

相关文章:

xml - 如何将字符串转换为函数名

postgresql - 删除 Windows 7 上的 postgres 用户帐户

ruby-on-rails - 如何将构建在 rails 上的本地 postgresql 数据库推送到 heroku?

postgresql - Blob 从 Informix 到 Postgres 的迁移数据

python-3.x - 等待分离的容器运行

json - 在golang中处理json继承

postgresql - 是否可以使用 PostgreSQL plv8 扩展创建可重用的函数?

docker - 检查点和docker export之间的区别

docker - 使用主机库的Docker

windows - Go 和 COM/ActiveX