gin-gonic / gin

Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.
https://gin-gonic.com/
MIT License
79.17k stars 8.03k forks source link

Gin SetMode not Passing Value to Function, Cause Panic Error On Minikube/Microk8s #4023

Open anggriawanrilda88 opened 3 months ago

anggriawanrilda88 commented 3 months ago

Description

this problem happen when I try to create pods on microk8s. gin setMode cannot pass the value from main.go. so, output return panic. I also try on minkube but the result same

How to reproduce

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    gin.SetMode(gin.DebugMode)
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    r.GET("/dbhost", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "DB_HOST": "etst",
        })
    })

    r.Run(":8080") // Jalankan server di port 8080
}

Expectations

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] GET    /dbhost                   --> main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080

Actual result

panic: gin mode unknown: debug ##debug, release (available mode: debug release test)

goroutine 1 [running]:
github.com/gin-gonic/gin.SetMode(...)
        /app/vendor/github.com/gin-gonic/gin/mode.go:74
github.com/gin-gonic/gin.init.0()
        /app/vendor/github.com/gin-gonic/gin/mode.go:53 +0x146
exit status 2

Environment

image

RedCrazyGhost commented 3 months ago

The default is gin.DebugMode, which can be manually specified My side is normal, later I will test this situation in version 1.22.5

package main

import "github.com/gin-gonic/gin"

func main()  {
    gin.SetMode(gin.DebugMode)
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(200,gin.H{"msg":"ok"})
    })
    r.Run(":9000")
}
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9000

go version go1.21.7 linux/amd64 gin version v1.10.0 os version 20.04.1-Ubuntu

RedCrazyGhost commented 3 months ago

https://github.com/gin-gonic/gin/blob/cc4e11438cd6c0bcc632fe3492d3817dfa21c337/mode.go#L73

https://github.com/gin-gonic/gin/blob/cc4e11438cd6c0bcc632fe3492d3817dfa21c337/mode.go#L52

Your code seems to have been modified again, and you need to check if the source code of the gin has been modified again

anggriawanrilda88 commented 3 months ago

hi RedCrazyGhost, thank for reply. in common linux, or windows or docker container, when I try run go gin with my code above, its normal work with no problem, but I try on kubernetes in microk8s and minikube its error happen. I even try enter to the exec on pods and run from there, but still error, I also debug on gin SetMode function for see what happen, and I found param not pass to the function.

JimChenWYU commented 3 months ago

image

maybe here is wrong, because you set a wrong global variable GIN_MODE