首頁 >後端開發 >Golang >docker compose healthcheck 未退出並出現錯誤無法啟動

docker compose healthcheck 未退出並出現錯誤無法啟動

WBOY
WBOY轉載
2024-02-06 08:50:031012瀏覽

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

問題內容

我有這個撰寫文件:

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"]

Dockerfile:

FROM golang:1.21 as builder

WORKDIR /src

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

當我執行 docker compose 時,應用程式的運行狀況檢查繼續運行。我希望容器退出並出現錯誤無法啟動容器。

golang程式碼main.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)
  }
}

這裡是登入應用程式:

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 輸出

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

正確答案


  1. #您的應用程式不知道它正在容器中運行。
  2. 您的主進程(go run main.go)正在以 PID 1 運行,您需要停止該進程才能退出容器,並且該進程受到保護。

了解了這兩個事實,您就有了幾種可能性:

  1. 在容器內安裝 docker cli。然後將 docker 套接字映射到容器中並執行 docker stop。將套接字對應到容器中意味著安全性問題-請小心操作。

  2. 運行ps -afx | 等指令grep 去| awk '{print $1}' | xargs Kill -9 (對這個答案表示敬意),即特別是在您的healthcheck 中,它可能看起來像curl -f http:// /本地主機:8080/失敗健康檢查|| (ps -afx | grep go | awk '{ print $1}' | xargs Kill -9)

  3. 但在我看來,您真正需要的是容器編排系統,例如 Kubernetes。這個建議可能有點過分,也可能不是。取決於您的專案計劃。無論如何,它將幫助您更穩健地管理正在運行的容器。

如果您想產生錯誤,則取決於您使用的日誌驅動程式。使用 syslog 驅動程序,Docker 容器將日誌寫入 /var/log/syslog。因此,在退出之前,您可能需要 echo "Error text"/var/log/syslog

以上是docker compose healthcheck 未退出並出現錯誤無法啟動的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除