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