亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Docker 容器之間建立連接

如何在 Docker 容器之間建立連接

Go
人到中年有點甜 2023-05-15 15:20:30
當我嘗試將我的 goLang GORM 服務連接到 Docker Postgress 容器時遇到連接問題。我相信問題出在連接字符串底部的 golang 代碼上。docker-compose upRecreating postgress_postgre_1 ... doneAttaching to postgrespostgres   | 2018-12-11 21:08:48.283 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432postgres   | 2018-12-11 21:08:48.283 UTC [1] LOG:  listening on IPv6 address "::", port 5432postgres   | 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 UTCpostgres   | 2018-12-11 21:08:48.328 UTC [1] LOG:  database system is ready to accept connections=== 當我運行 golang 時,我得到...恐慌:無法連接數據庫=============== docker-compose.ymlversion: '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/==== 主.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.DBvar err errorfunc 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 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

您的撰寫文件中有錯字,您將服務命名為 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/


查看完整回答
反對 回復 2023-05-15
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

看起來好像您正在丟棄從返回的錯誤gorm.Open()。要確切知道 gorm 無法打開連接的原因,您需要輸出錯誤。

代替:

panic("failed to connect database")

使用:

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

一眼看去,可能是你的主機配置錯誤

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()在第一次檢查錯誤之前不要打電話。在出現錯誤的情況下,可能dbnil導致對任何db方法的調用出現恐慌。您還在db.Close()發布的代碼片段中調用了兩次。不要這樣做。Golang 的文檔io.Closer

Closer 是包裝基本 Close 方法的接口。

第一次調用后 Close 的行為未定義。具體的實現可能會記錄他們自己的行為。

編輯(12/12/2018):

當我在本地運行你的代碼時,我從 gorm 得到的錯誤是關于 SSL 的,因為你正在通過 docker-compose 運行你的 postgres 服務器而沒有任何 SSL 配置。您可以將sslmode=disable標志添加到連接字符串以解決此問題。

docker-compose.yml您的: POSTGRESS_DBshould be也有錯字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!")

}


查看完整回答
反對 回復 2023-05-15
  • 2 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號