程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了连接 Golang 和 Postgres docker 容器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决连接 Golang 和 POSTGRes docker 容器?

开发过程中遇到连接 Golang 和 POSTGRes docker 容器的问题如何解决?下面主要结合日常开发的经验,给出你关于连接 Golang 和 POSTGRes docker 容器的解决方法建议,希望对你解决连接 Golang 和 POSTGRes docker 容器有所启发或帮助;

我正在尝试在 localhost:8080 上运行一个使用 POSTGRes 数据库的 golang 服务器。我尝试将数据库和服务器都容器化,但似乎无法将它们连接起来。

@H_514_5@ma​​in.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).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=${@R_673_5341@}
            
        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 container ls 的输出是否具有 ep-server 的运行状态)立>
  2. 运行 docker logs ep-server 以查看错误(如果有)
  3. 如果日志中没有错误,则运行 docker exec -it ep-server bash 以登录到您的容器并运行 telnet ep-db 5432验证您的 POSTGRes 实例是否可从 ep-server 访问

大佬总结

以上是大佬教程为你收集整理的连接 Golang 和 Postgres docker 容器全部内容,希望文章能够帮你解决连接 Golang 和 Postgres docker 容器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。