Heim  >  Artikel  >  Backend-Entwicklung  >  Docker Compose Healthcheck wurde nicht beendet, es ist ein Fehler aufgetreten und konnte nicht gestartet werden

Docker Compose Healthcheck wurde nicht beendet, es ist ein Fehler aufgetreten und konnte nicht gestartet werden

WBOY
WBOYnach vorne
2024-02-06 08:50:03988Durchsuche

docker compose healthcheck 未退出并出现错误无法启动

Frageninhalt

Ich habe diese Erstellungsdatei:

version: "3"
services:
  app:
    build: .
    ports:
      - 8080:8080
    volumes:
      - "./:/src"
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:8080/fail-health-check || exit 1"]
      interval: 5s
      timeout: 5s
      retries: 1
    command: ["go", "run", "main.go"]

Docker-Datei:

FROM golang:1.21 as builder

WORKDIR /src

COPY go.mod go.sum ./
RUN go mod download

Wenn ich Docker Compose ausführe, werden die Gesundheitsprüfungen der Anwendung weiterhin ausgeführt. Ich möchte, dass der Container mit der Fehlermeldung „Container konnte nicht gestartet werden“ beendet wird.

Golang-Codemain.go

package main

import (
    "fmt"
    "log"

    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

func main() {
  r := echo.New()
  r.Use(middleware.Logger())
  
  fmt.Println("start http server on port 8080")
  if err := r.Start(":8080"); err != nil {
    log.Fatal(err)
  }
}

Hier ist die Login-App:

test_healthcheck_go_app-app-1  | {"time":"2023-11-14T04:08:42.450751594Z","id":"","remote_ip":"127.0.0.1","host":"localhost:8080","method":"GET","uri":"/fail-health-check","user_agent":"curl/7.88.1","status":404,"error":"code=404, message=Not Found","latency":26375,"latency_human":"26.375µs","bytes_in":0,"bytes_out":24}

docker ps Ausgabe

CONTAINER ID   IMAGE                         COMMAND            CREATED          STATUS                      PORTS                    NAMES
ff389f13ab1d   test_healthcheck_go_app-app   "go run main.go"   48 seconds ago   Up 46 seconds (unhealthy)   0.0.0.0:8080->8080/tcp   test_healthcheck_go_app-app-1

Richtige Antwort


  1. Ihre Anwendung weiß nicht, dass sie in einem Container ausgeführt wird.
  2. Ihr Hauptprozess (go run main.go)正在以 PID 1) läuft, Sie müssen den Prozess stoppen, um den Container zu verlassen, und der Prozess ist geschützt

Wenn Sie diese beiden Fakten verstehen, haben Sie mehrere Möglichkeiten:

  1. Installieren Sie Docker CLI im Container. Ordnen Sie dann den Docker-Socket dem Container zu und führen Sie ihn aus docker stop. Das Zuordnen von Sockets zu Containern hat Auswirkungen auf die Sicherheit. Gehen Sie daher mit Vorsicht vor.

  2. Lauf ps -afx | 等命令grep 去 | awk '{print }' | xargs Kill -9 (对这个答案表示敬意),即特别是在您的 healthcheck 中,它可能看起来像 curl -f http:// /本地主机:8080/失败健康检查 || (ps -afx | grep go | awk '{print }' | xargs Kill -9)

  3. Aber meiner Meinung nach braucht man wirklich ein Container-Orchestrierungssystem wie Kubernetes. Dieser Rat kann etwas viel sein oder auch nicht. Hängt von Ihrem Projektplan ab. Unabhängig davon wird es Ihnen dabei helfen, Ihre laufenden Container robuster zu verwalten.

Ob Sie einen Fehler generieren möchten, hängt davon ab, welchen Protokollierungstreiber Sie verwenden. Verwenden Sie syslog 驱动程序,Docker 容器将日志写入 /var/log/syslog。因此,在退出之前,您可能需要 echo "Error text"/var/log/syslog.

Das obige ist der detaillierte Inhalt vonDocker Compose Healthcheck wurde nicht beendet, es ist ein Fehler aufgetreten und konnte nicht gestartet werden. 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