Как установить соединение между Docker Containers - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблемы с подключением при попытке подключить сервис goLang GORM к контейнеру Docker Postgress.Я полагаю, что проблема в том, что мой код golang внизу в строке подключения.

docker-compose up
Recreating postgress_postgre_1 ... done
Attaching to postgres
postgres   | 2018-12-11 21:08:48.283 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres   | 2018-12-11 21:08:48.283 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres   | 2018-12-11 21:08:48.291 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres   | 2018-12-11 21:08:48.316 UTC [20] LOG:  database system was shut down at 2018-12-11 21:08:44 UTC
postgres   | 2018-12-11 21:08:48.328 UTC [1] LOG:  database system is ready to accept connections

=== при запуске golang я получаю ... паника: не удалось подключиться к базе данных

=============== docker-compose.yml

version: '3.6'
services:
  postgre:
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    network_mode: bridge
    container_name: postgres

    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'password'
      POSTGRESS_DB: 'db_amex01'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/

==== main.go

основной пакет

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
    "github.com/jinzhu/gorm"

    // _ "github.com/jinzhu/gorm/dialects/sqlite"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

// _ "github.com/jinzhu/gorm/blob/master/dialects/postgres"

type ToDo struct {
    gorm.Model
    ID          int    `json:"id"`
    TASK_STRING string `json:"task_string"`
    DONE        bool   `json:"done"`
}

var db *gorm.DB
var err error

func main() {
    const (
        host     = "localhost"
        port     = 5432
        user     = "postgres"
        password = "password"
        dbname   = "db_amex01"
    )


// this is the problem I believe I am having...

    db, err := gorm.Open("postgres", "host='postgres' port=5432 user=user dbname='db_amex01' password='password'")



    defer db.Close()

    if err != nil {
        panic("failed to connect database")
    }

    defer db.Close()

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

В вашем файле compose есть опечатка, вы называете сервис postgre, но подключаетесь к postgres.Docker использует имя службы для псевдонима DNS в совместно используемой сети, поэтому это прервет вашу попытку подключения.Чтобы исправить, просто переименуйте свой сервис:

version: '3.6'
services:
  postgres:
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'password'
      POSTGRESS_DB: 'db_amex01'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/
0 голосов
/ 12 декабря 2018

Похоже, что вы отбрасываете ошибку, возвращенную из gorm.Open().Чтобы точно знать, почему gorm не удалось открыть соединение, вам нужно вывести ошибку.

Вместо:

panic("failed to connect database")

Использование:

panic("failed to connect database: " + err)

Atна первый взгляд, возможно, ваш хост неправильно настроен

host='postgres' port=5432 user=user dbname='db_amex01' password='password'

Должно быть:

host=localhost port=5432 user=user dbname=db_amex01 password=password

Но трудно сказать без ошибки от gorm.Open()

Еще одна вещь, которую стоит отметить;не звоните db.Close() перед первой проверкой ошибки.Возможно, что в случае ошибки db может быть nil, вызывая панику к вызовам любого из db методов.Вы также дважды вызываете db.Close() в фрагменте кода, который вы разместили.Не делай этого.Документация Голанга по io.Closer:

Closer - это интерфейс, который обертывает базовый метод Close.

Поведение Close после первого вызова не определено.Определенные реализации могут документировать свое собственное поведение.

Редактировать (12/12/2018):

Когда я запускал ваш код локально, ошибка, которую я получил от gorm, касалась SSL, потому чтовы используете свой сервер postgres через docker-compose без какой-либо конфигурации SSL.Вы можете добавить флаг sslmode=disable в строку подключения, чтобы решить эту проблему.

Также в вашем docker-compose.yml есть опечатка: POSTGRESS_DB должно быть POSTGRES_DB.

Вотполный рабочий пример, который я запустил локально:

docker-compose.yml:

version: '3.6'
services:
  postgres:
    image: postgres:11.1-alpine
    ports:
      - '5432:5432'
    environment:
      POSTGRES_USER: 'test_user'
      POSTGRES_PASSWORD: 'test_password'
      POSTGRES_DB: 'test_database'
    volumes:
      - ./init:/docker-entrypoint-initdb.d/

main.go:

package main

import (
    "fmt"
    "log"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

const (
    host     = "localhost"
    port     = "5432"
    user     = "test_user"
    password = "test_password"
    dbname   = "test_database"
)

func main() {
    url := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
        user,
        password,
        host,
        port,
        dbname,
    )

    db, err := gorm.Open("postgres", url)
    if err != nil {
        log.Fatalf("error connecting to database: %v", err)
    }
    defer db.Close()

    if err := db.DB().Ping(); err != nil {
        log.Fatalf("error pinging database: %v", err)
    }

    fmt.Println("Success!")
}
...