Maison  >  Article  >  développement back-end  >  Quitter une fois l'exécution du conteneur terminée

Quitter une fois l'exécution du conteneur terminée

WBOY
WBOYavant
2024-02-09 09:50:191083parcourir

Quitter une fois lexécution du conteneur terminée

Dans le développement web, les conteneurs sont une technologie courante, comme Docker, Kubernetes, etc. Ils peuvent fournir des fonctions d'isolation de l'environnement et de gestion des ressources, permettant aux applications de s'exécuter dans différents environnements. Cependant, nous souhaitons parfois que le conteneur se ferme automatiquement une fois son exécution terminée, au lieu de le laisser fonctionner. Alors, comment implémenter le conteneur pour qu'il se ferme automatiquement une fois son exécution terminée ? Cet article vous présentera quelques méthodes et techniques de mise en œuvre.

Contenu de la question

Mon serveur fibre Golang se ferme automatiquement et affiche le message suivant lors de son exécution sur Google Cloud Run :

container called exit(0).

Je l'ai exécuté en utilisant le fichier docker suivant

# 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"]

et mon main.go (uniquement 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")
}

La dernière ligne s'exécute correctement dans le journal d'exécution de Google Cloud et je peux voir api 开始侦听端口 8080.

Pourquoi mes conteneurs sortent-ils seuls ? Il devrait démarrer l'API fibre.

Solution

J'ai trouvé ce problème. Dans mon stage.env 文件中,我将端口设置为 :8080. Localement, passez app.listen(c.port) 可以按预期很好地转换为 app.listen(":8080") 。当在 cloud run 中使用它时,它会转换为 app.listen("8080"), ce qui bien sûr ne fonctionne pas car il pense qu'il s'agit de l'hébergeur et non du port.

J'ai ajouté app.listen(":" + c.port) et ça marche.

Si cela vous arrive, détectez l'erreur :

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)
}

Et agissez en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer