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

Exit after the container is finished running

WBOY
Release: 2024-02-09 09:50:19
forward
1117 people have browsed it

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).
Copy after login

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"]
Copy after login

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")
}
Copy after login

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)
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template