Maison > développement back-end > Golang > 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
Libérer: 2024-02-06 08:50:03
avant
1029 Les gens l'ont consulté

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"]
Copier après la connexion

Fichier Docker :

FROM golang:1.21 as builder

WORKDIR /src

COPY go.mod go.sum ./
RUN go mod download
Copier après la connexion

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)
  }
}
Copier après la connexion

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}
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal