In web development, containers are a common technology, such as Docker, Kubernetes, etc. They can provide environment isolation and resource management functions, allowing applications to run in different environments. However, sometimes we want the container to automatically exit after it is finished running, instead of keeping it running. So, how to implement the container to automatically exit after it is finished running? This article will introduce you to some implementation methods and techniques.
My golang fiber server automatically exits and displays the following message when running on google cloud run:
container called exit(0).
I run it using the following dockerfile
# use the offical golang image to create a binary. from golang:buster as builder # create and change to the app directory. workdir /app # retrieve application dependencies. copy go.mod ./ copy go.sum ./ run go mod download copy . ./ run go build # use the official debian slim image for a lean production container. # https://hub.docker.com/_/debian # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage- builds from debian:buster-slim run set -x && apt-get update && debian_frontend=noninteractive apt-get install -y \ ca-certificates && \ rm -rf /var/lib/apt/lists/* # copy the binary to the production image from the builder stage. copy --from=builder /app/redirect-middleware.git /app/ copy --from=builder /app/pkg /app/pkg/ expose 8080 # run the web service on container startup. cmd ["/app/redirect-middleware.git", "dev"]
and my main.go (only func main())
func main() { // Load env config c, err := config.LoadConfig() if err != nil { log.Fatalln("Failed at config", err) } // init DB db.InitDb() // init fiber API app := fiber.New() log.Print("Started new Fiber app...") // initial route sending version of API app.Get("/", func(c *fiber.Ctx) error { return c.SendString(fmt.Sprintf("Redirection middleware - v%s", viper.Get("Version").(string))) }) log.Print("Default root route set...") // api routes api := app.Group("/api") // /api v1 := api.Group("/v1") // /api/v1 log.Print("api/v1 group set...") // register routes v1 mastermenus.RegisterRoutes(v1) log.Print("Route registered...") app.Listen(c.Port) log.Print("Api started listening in port 8080") }
The last line executes fine in the google cloud run log and I can see that the api starts listening on port 8080
.
Why does my container exit alone? It should start the fiber api.
I found this problem. In my stage.env
file, I set the port to :8080
.
Locally, passing app.listen(c.port)
converts fine to app.listen(":8080")
as expected. When using this in cloud run it converts to app.listen("8080")
which of course doesn't work as it thinks this is the host and not the port.
I added app.listen(":" c.port)
and it works.
If you encounter this situation, catch the error:
errApp := app.Listen(":" + c.Port) if errApp != nil { log.Printf("An error happened while running the api: %s", errApp) } else { log.Printf("Api started listening in port %s", c.Port) }
and take appropriate action.
The above is the detailed content of Exit after the container is finished running. For more information, please follow other related articles on the PHP Chinese website!