使用nestjs应用程序在docker-compose中进行健康检查

问题描述 投票:0回答:1

我正在使用 Nestjs 应用程序进行 docker-compose,但运行状况检查根本不起作用,我的配置有问题吗?

version: '3.1'

services:
 backend:
    image: my_image
    ports:
      - 3009:3009
    environment:
      PORT: 3009
      DB_NAME: my_db_name
      DB_PORT: 5432
      DB_USERNAME: postgres
      DB_PASSWORD: 992002
      DB_HOST: postgres
    depends_on:
      postgres:
        condition: service_healthy
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:3009" ]
      interval: 10s
      timeout: 5s
      retries: 2

  frontend:
    image: my_image2
    ports:
      - 3000:3000
    environment:
      PORT: 3000
      NEXT_PUBLIC_SERVER_URL: http://backend:3009
      NEXT_PUBLIC_SERVER_URL_CLIENT_COMPONENT: http://localhost:3009
    depends_on:
      backend:
        condition: service_healthy

我已经有了使用终点站进行健康检查的路线:

@Controller()
export class AppController {
  constructor(
    private health: HealthCheckService,
    private http: HttpHealthIndicator,
  ) {}

  @Get()
  @HealthCheck()
  check() {
    return this.health.check([
      () => this.http.pingCheck('backend', 'http://localhost:3009'),
    ]);
  }
}

当我进行 docker-compose 时,我的后端总是变得不健康。

我想对nestjs应用程序进行健康检查并得到healthy_services结果,但我得到unhealthy_services结果。

docker docker-compose nestjs health-check
1个回答
0
投票

我尝试了这种方法,创建了一个示例 Nestjs 项目

Dockerfile

FROM node:20

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --ignore-scripts

COPY . .

ENV PORT=8005

EXPOSE 8005

RUN npm run build

# CMD [ "node", "dist/main.js" ]
CMD ["npm", "run", "start"]

docker-compose

version: '2'
services:
    web:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
            - "8005:8005"
        volumes:
            - .:/code       
        labels:
            - "autoheal=true"
        healthcheck:
          test: [ "CMD", "curl", "-f", "http://localhost:8005/health" ]
          interval: 10s
          timeout: 5s
          retries: 3
          start_period: 60s
   

Health.controller.ts

import { Controller, Get } from '@nestjs/common';
import {
  HealthCheckService,
  HttpHealthIndicator,
  HealthCheck,
} from '@nestjs/terminus';

@Controller('health')
export class HealthController {
  constructor(
    private health: HealthCheckService,
    private http: HttpHealthIndicator,
  ) {}

  @Get()
  @HealthCheck()
  check() {
    console.log('Health check');
    
    return this.health.check([
      () => this.http.pingCheck('backend', 'http://localhost:8005'),
    ]);
  }
}

容器日志

container logs

© www.soinside.com 2019 - 2024. All rights reserved.