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.
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.
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!