Rumah >pembangunan bahagian belakang >Golang >docker compose healthcheck tidak keluar dan ralat berlaku dan tidak dapat dimulakan

docker compose healthcheck tidak keluar dan ralat berlaku dan tidak dapat dimulakan

WBOY
WBOYke hadapan
2024-02-06 08:50:031016semak imbas

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

Kandungan soalan

Saya ada fail karang ini:

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

Fail Docker:

FROM golang:1.21 as builder

WORKDIR /src

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

Apabila saya menjalankan docker compose, pemeriksaan kesihatan aplikasi terus dijalankan. Saya mahu bekas itu keluar dengan ralat Tidak dapat memulakan bekas.

kod golangmain.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)
  }
}

Berikut ialah apl log masuk:

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 keluaran

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

Jawapan betul


  1. Aplikasi anda tidak tahu ia berjalan dalam bekas.
  2. Proses utama anda (go run main.go)正在以 PID 1) sedang berjalan, anda perlu menghentikan proses untuk keluar dari bekas, dan proses itu dilindungi

Memahami dua fakta ini, anda mempunyai beberapa kemungkinan:

  1. Pasang docker cli di dalam bekas. Kemudian petakan soket docker ke dalam bekas dan jalankan docker stop. Memetakan soket ke dalam bekas mempunyai implikasi keselamatan - teruskan dengan berhati-hati.

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

  3. Tetapi pada pendapat saya, apa yang anda perlukan sebenarnya adalah sistem orkestrasi kontena seperti Kubernetes. Nasihat ini mungkin atau mungkin tidak sedikit. Bergantung pada rancangan projek anda. Walau apa pun, ini akan membantu anda mengurus bekas yang sedang berjalan dengan lebih mantap.

Jika anda ingin menjana ralat, ia bergantung pada pemacu pengelogan yang anda gunakan. Gunakan syslog 驱动程序,Docker 容器将日志写入 /var/log/syslog。因此,在退出之前,您可能需要 echo "Error text"/var/log/syslog.

Atas ialah kandungan terperinci docker compose healthcheck tidak keluar dan ralat berlaku dan tidak dapat dimulakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam