已部署的应用程序立即自行关闭
Deployed application shuts itself down immediately
我有一个 Go rest API 应用程序。我将其 Docker 化并将其部署到 Kubernetes。
它在我的本地正常工作。
但在 Kubernetes 中,应用程序会自行关闭,并且 pod 会重新启动。
它不打印任何内容、任何日志或任何失败。
import (
" github.com/gorilla/mux"
"net/http"
"log"
)
func main() {
controller := controllers.Controllers{}
router := mux.NewRouter()
router.HandleFunc("/customer", controller.GetCustomer()).Methods("GET")
router.HandleFunc("/customer", controller.InsertCustomer()).Methods("POST")
router.HandleFunc("/healthcheck", controller.HealthCheck())
addr := ":" + os.Getenv("PORT")
srv := &http.Server{Addr: addr, Handler: router}
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}
}()
println("reached here")
}
令人惊讶的是,当我查看日志时它会打印“到达此处”行。
我检查了 env
变量,它也是正确的。
我怀疑对 listenAndServe
的调用失败了,但我找不到合理的答案。
当 main()
功能结束时,您的应用程序也会结束。它不会等待其他非主 goroutines 完成。参见 Spec: Program execution:
Program execution begins by initializing the main package and then invoking the function main
. When that function invocation returns, the program exits. It does not wait for other (non-main
) goroutines to complete.
由于您在新的 goroutine 中启动了 listerer,因此没有任何“阻塞”main()
,没有什么可做的(在打印 "reached here"
之后),所以您的应用程序结束了。请注意,内置 println()
打印到标准错误,这就是为什么您可能看不到任何日志(标准输出和标准错误可能会保存/重定向到不同的地方)。
最简单的“修复”是在 main()
中开始收听:
srv := &http.Server{Addr: addr, Handler: router}
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}
我有一个 Go rest API 应用程序。我将其 Docker 化并将其部署到 Kubernetes。 它在我的本地正常工作。
但在 Kubernetes 中,应用程序会自行关闭,并且 pod 会重新启动。
它不打印任何内容、任何日志或任何失败。
import (
" github.com/gorilla/mux"
"net/http"
"log"
)
func main() {
controller := controllers.Controllers{}
router := mux.NewRouter()
router.HandleFunc("/customer", controller.GetCustomer()).Methods("GET")
router.HandleFunc("/customer", controller.InsertCustomer()).Methods("POST")
router.HandleFunc("/healthcheck", controller.HealthCheck())
addr := ":" + os.Getenv("PORT")
srv := &http.Server{Addr: addr, Handler: router}
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}
}()
println("reached here")
}
令人惊讶的是,当我查看日志时它会打印“到达此处”行。
我检查了 env
变量,它也是正确的。
我怀疑对 listenAndServe
的调用失败了,但我找不到合理的答案。
当 main()
功能结束时,您的应用程序也会结束。它不会等待其他非主 goroutines 完成。参见 Spec: Program execution:
Program execution begins by initializing the main package and then invoking the function
main
. When that function invocation returns, the program exits. It does not wait for other (non-main
) goroutines to complete.
由于您在新的 goroutine 中启动了 listerer,因此没有任何“阻塞”main()
,没有什么可做的(在打印 "reached here"
之后),所以您的应用程序结束了。请注意,内置 println()
打印到标准错误,这就是为什么您可能看不到任何日志(标准输出和标准错误可能会保存/重定向到不同的地方)。
最简单的“修复”是在 main()
中开始收听:
srv := &http.Server{Addr: addr, Handler: router}
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}