Gorm + Docker ошибка при подключении

Я пытаюсь подключиться к моей базе данных postgresql с помощью Docker:

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, dnz-api dnz-api | 2017/11/05 10:23:46 dial tcp 172.21.0.2:5432: getsockopt: соединение отклонено dnz-api | статус выхода 1 dnz-api вышел с кодом 1

Что я делаю не так?

1 ответ

Решение

Вы не можете подключиться к вашему psql контейнер, потому что вы не связали его. Посмотрите документацию Docker-Compose по ссылкам.

Кроме того, я предполагаю, что вы не планируете свой заказ на запуск контейнера. Psql контейнер должен начаться до golang один. Ознакомьтесь с документацией Docker Compose по порядку запуска. Вы можете использовать функцию 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.

Другие вопросы по тегам