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
Lepaskan: 2024-02-06 08:50:03
ke hadapan
1030 orang telah melayarinya

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"]
Salin selepas log masuk

Fail Docker:

FROM golang:1.21 as builder

WORKDIR /src

COPY go.mod go.sum ./
RUN go mod download
Salin selepas log masuk

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)
  }
}
Salin selepas log masuk

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}
Salin selepas log masuk

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
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan