Home >Backend Development >Golang >Exit after the container is finished running

Exit after the container is finished running

WBOY
WBOYforward
2024-02-09 09:50:191119browse

Exit after the container is finished running

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.

Question content

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.

Solution

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete