Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-09 09:50:19
nach vorne
1113 Leute haben es durchsucht

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).
Nach dem Login kopieren

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"]
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage