Maison  >  Article  >  développement back-end  >  docker compose healthcheck ne s'est pas terminé et une erreur s'est produite et n'a pas pu être démarré

docker compose healthcheck ne s'est pas terminé et une erreur s'est produite et n'a pas pu être démarré

WBOY
WBOYavant
2024-02-06 08:50:03989parcourir

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

Contenu de la question

J'ai ce fichier de composition :

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

Fichier Docker :

FROM golang:1.21 as builder

WORKDIR /src

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

Lorsque j'exécute Docker Compose, les vérifications de l'état de l'application continuent de s'exécuter. Je souhaite que le conteneur se ferme avec l'erreur Impossible de démarrer le conteneur.

code 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)
  }
}

Voici l'application de connexion :

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 sortie

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

Bonne réponse


  1. Votre application ne sait pas qu'elle s'exécute dans un conteneur.
  2. Votre processus principal (go run main.go)正在以 PID 1) est en cours d'exécution, vous devez arrêter le processus pour quitter le conteneur et le processus est protégé
  3. .

Comprenant ces deux faits, vous avez plusieurs possibilités :

  1. Installez Docker cli à l'intérieur du conteneur. Mappez ensuite le socket docker dans le conteneur et exécutez docker stop. Le mappage des sockets dans des conteneurs a des implications en matière de sécurité : procédez avec prudence.

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

  3. Mais à mon avis, ce dont vous avez vraiment besoin, c'est d'un système d'orchestration de conteneurs comme Kubernetes. Ce conseil peut être un peu excessif ou non. Cela dépend de votre plan de projet. Quoi qu’il en soit, cela vous aidera à gérer vos conteneurs en cours d’exécution de manière plus robuste.

Si vous souhaitez générer une erreur, cela dépend du pilote de journalisation que vous utilisez. Utilisez syslog 驱动程序,Docker 容器将日志写入 /var/log/syslog。因此,在退出之前,您可能需要 echo "Error text"/var/log/syslog.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer