我正在使用 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结果。
我尝试了这种方法,创建了一个示例 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'),
]);
}
}
容器日志