簡體   English   中英

連接 Golang 和 Postgres docker 容器

[英]Connecting Golang and Postgres docker containers

我正在嘗試在 localhost:8080 上運行一個使用 postgres 數據庫的 golang 服務器。 我試圖將數據庫和服務器都容器化,但似乎無法將它們連接起來。

主.go

func (a *App) Initialize() {
    var db *gorm.DB
    var err error
    envErr := godotenv.Load(".env")
    if envErr != nil {
        log.Fatalf("Error loading .env file")
    }
    var dbString = fmt.Sprintf("port=5432 user=sample dbname=sampledb sslmode=disable password=password host=db")
    
    db, err = gorm.Open("postgres", dbString)
    if err != nil {
        fmt.Printf("failed to connect to databse\n",err)
    }
    a.DB=model.DBMigrate(db)
    a.Router = mux.NewRouter()
    a.setRoutes()
}

//Get : get wrapper
func (a *App) Get(path string, f func(w http.ResponseWriter, r *http.Request)) {
    a.Router.HandleFunc(path, f).Methods("GET")
}

//Post : post wrapper
func (a *App) Post(path string, f func(w http.ResponseWriter, r *http.Request)) {
    a.Router.HandleFunc(path, f).Methods("POST")
}

//Run : run on port
func (a *App) Run(port string) {
    handler := cors.Default().Handler(a.Router)
    log.Fatal(http.ListenAndServe(port, handler))
}

func (a *App) setRoutes() {
    a.Get("/", a.handleRequest(controller.Welcome))
    a.Get("/users", a.handleRequest(controller.GetUsers))
    a.Get("/user/{id}", a.handleRequest(controller.GetUser))
    a.Post("/login", a.handleRequest(controller.HandleLogin))
    a.Post("/users/add", a.handleRequest(controller.CreateUser))
    a.Post("/validate", a.handleRequest(controller.HandleValidation))
}

func main() {
    app := &App{}
    app.Initialize()
    app.Run(":8080")

}


服務器 Dockerfile

FROM golang:latest

RUN mkdir /app
WORKDIR /app/server

COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .

docker-compose.yml

version: '3.7'
services:
    db:
        image: postgres
        container_name: ep-db
        environment:
            - POSTGRES_PORT=${DB_PORT}
            - POSTGRES_USER=${DB_USERNAME}  
            - POSTGRES_PASSWORD=${DB_PASSWORD}
            - POSTGRES_DB=${DB_NAME}
            
        ports:
            - '5432:5432'
        volumes:
            - ./db:/var/lib/postgresql/data"
        networks:
            - internal
    server:
        container_name: ep-server
        build:
            context: ./server
            dockerfile: Dockerfile
        command: bash -c "go build && ./server -b 0.0.0.0:8080 --timeout 120"
        volumes:
            - './server:/app/server'
        expose:
            - 8080
        depends_on: 
            - db
        networks:
            - internal
        stdin_open: true
volumes:
    db:  
    server:
networks:
    internal:
      driver: bridge

當我在我的計算機上本地運行它時,我有一些 get 和 post 請求返回正確的值(例如 localhost:8080/users 將返回一個 JSON 完整的數據庫用戶)但是當我在服務器容器內使用 curl 時,我沒有得到任何結果。 我是 docker 的新手,到目前為止我在做什么有問題嗎?

每個 docker 容器都有自己的 IP 地址。 當您從應用程序連接到 postgres 數據庫時,您使用的是localhost ,它是應用程序的容器,而不是數據庫。 根據您的 docker-compose,您應該使用主機名db (服務名稱)連接到數據庫。

正如@DavidMaze 所建議的,您應該驗證服務器容器中的日志。 還,

  1. 首先確保ep-server正在運行(檢查docker 容器 ls的 output 的狀態是否為ep-server運行)
  2. 運行docker logs ep-server查看錯誤(如果有)
  3. 如果日志中沒有錯誤,則運行docker exec -it ep-server bash登錄到您的容器並運行telnet ep-db 5432以驗證您的 postgres 實例是否可以從 ep-server 訪問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM