In der Webentwicklung sind Container eine gängige Technologie, wie Docker, Kubernetes usw. Sie können Umgebungsisolations- und Ressourcenverwaltungsfunktionen bereitstellen, sodass Anwendungen in verschiedenen Umgebungen ausgeführt werden können. Manchmal möchten wir jedoch, dass der Container automatisch beendet wird, nachdem er ausgeführt wurde, anstatt ihn weiterhin auszuführen. Wie kann man also implementieren, dass der Container automatisch beendet wird, nachdem er ausgeführt wurde? In diesem Artikel werden einige Implementierungsmethoden und -techniken vorgestellt.
Mein Golang-Fibre-Server wird automatisch beendet und zeigt die folgende Meldung an, wenn er auf Google Cloud Run ausgeführt wird:
container called exit(0).
Ich habe es mit der folgenden Docker-Datei ausgeführt
# 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"]
und mein main.go (nur 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") }
Die letzte Zeile wird im Google Cloud-Ausführungsprotokoll einwandfrei ausgeführt und ich kann api 开始侦听端口 8080
sehen.
Warum gehen meine Container alleine aus? Es sollte die Fibre-API starten.
Ich habe dieses Problem gefunden. In meinem stage.env
文件中,我将端口设置为 :8080
.
Übergeben Sie vor Ort app.listen(c.port)
可以按预期很好地转换为 app.listen(":8080")
。当在 cloud run 中使用它时,它会转换为 app.listen("8080")
, was natürlich nicht funktioniert, da angenommen wird, dass dies der Host und nicht der Port ist.
Ich habe app.listen(":" + c.port)
hinzugefügt und es funktioniert.
Wenn Ihnen das passiert, erkennen Sie den Fehler:
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) }
Und handeln Sie entsprechend.
Das obige ist der detaillierte Inhalt vonBeenden Sie den Vorgang, nachdem der Container vollständig ausgeführt wurde. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!