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