Heim  >  Artikel  >  Backend-Entwicklung  >  Beenden Sie den Vorgang, nachdem der Container vollständig ausgeführt wurde

Beenden Sie den Vorgang, nachdem der Container vollständig ausgeführt wurde

WBOY
WBOYnach vorne
2024-02-09 09:50:191081Durchsuche

Beenden Sie den Vorgang, nachdem der Container vollständig ausgeführt wurde

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.

Frageninhalt

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.

Lösung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen