ASP.NET CORE在docker中的健康检查(healthcheck)

在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错误的发生,同时,合理设计的健康检查也能够提供给外界关于应用程序状态的一些信息。

实践一下,现在docker-compose里面是这样:

version: '3.7'
services:
  postgres:
    container_name: postgres-container
    image: postgres:13
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: "123456"
      PGDATA: "/var/lib/postgresql/data/pgdata"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - dotnet-network

  dotnet-service:
    image: dotnet-service:latest
    container_name: dotnet-service-container
    ports:
      - 5000:5000
    build:
      context: ./TestWeb/
      dockerfile: ./TestWeb/Dockerfile
    environment:
      # - ASPNETCORE_ENVIRONMENT=Docker
      - ASPNETCORE_URLS=http://*:5000
      - App__SelfUrl=http://*:5000
    restart: on-failure
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - dotnet-network

networks:
  dotnet-network:
    external: false

首先调整一下程序:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHealthChecks();

var app = builder.Build();

app.MapHealthChecks("/healthz");

app.Run();

如果直接运行的话,web访问/healthz节点,那么可以页面将直接返回 Healthy。看上去没有问题,那我们按照要求调整一下Dockerfile

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit
ENTRYPOINT ["dotnet", "TestWeb.dll"]

然后调整docker-compose.yml文件,让postgres启动依赖dotnet-service:

version: '3.7'
services:
  postgres:
    container_name: postgres-container
    image: postgres:13
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: "123456"
      PGDATA: "/var/lib/postgresql/data/pgdata"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    depends_on:
      dotnet-service:
        condition: service_healthy
    networks:
      - dotnet-network

  dotnet-service:
    image: dotnet-service:latest
    container_name: dotnet-service-container
    ports:
      - 5000:5000
    build:
      context: ./TestWeb/
      dockerfile: ./TestWeb/Dockerfile
    environment:
      # - ASPNETCORE_ENVIRONMENT=Docker
      - ASPNETCORE_URLS=http://*:5000
      - App__SelfUrl=http://*:5000
    restart: on-failure
    networks:
      - dotnet-network

networks:
  dotnet-network:
    external: false

然后postgres就启动不了了,提示容器unhealthy。运行docker ps,发现.net容器的后面有一个unhealthy。但是程序访问正常,说明只是没有正确运行这段话而已。

Dockerfile方案

文档说.NET 6的镜像里面不带curl这个工具了,需要手动装一下:

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
RUN apt-get update && apt-get install -y curl
HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit
ENTRYPOINT ["dotnet", "TestWeb.dll"]

这样再看,就完全没问题了,如果把aspnet:6.0改成aspnet:6.0-alpine,空间更节省了(默认是239M,alpine版是108M),还自带了wget,也没必要这么麻烦先安装curl(比较费时间按)。

HEALTHCHECK CMD wget --spider http://localhost:5000/healthz || exit

docker-compose方案

我不太喜欢去改Dockerfile,而是更倾向于修改docker-compose.yml文件。当然,没有curl依然还是得在Dockerfile中添加相应语句安装,但是可以删除HEALTHCHECK这一条了,直接在docker-compose.yml中对应服务下面添加:

healthcheck:
    test: ["CMD-SHELL", "wget --spider http://localhost:5000/healthz || exit"]
    interval: 10s
    timeout: 5s
    retries: 5

程序依然可以正常运行。

P.S. 如果程序没有使用AddHealthChecks,那么也可以使用暴力一点的,直接用HEALTHCHECK CMD curl –fail http://localhost:5000 || exit,只要能够正常访问页面,就认为是Healthy,不过肯定就少了很多高级特性了。

Original: https://www.cnblogs.com/podolski/p/16603177.html
Author: 波多尔斯基
Title: ASP.NET CORE在docker中的健康检查(healthcheck)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578050/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ABCD四个顺序执行方法,拓展性延申

    今天在群里,有人问 有几个void返回值&amp…

    Linux 2023年6月7日
    0131
  • docker –link容器互联

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    0100
  • DotNet发布程序到NuGet

    1、新建一个类库 2、选择项目属性,在包栏目下填写 3、选择项目,鼠标右键”打包” 主要注意的是生成配置需改为 Release 4、然后就可以在我们项目 b…

    Linux 2023年6月13日
    099
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 我经常听到人们说磁盘慢,网络很慢,这是从人类感知的角度来表达的。比如,把一个文件拷贝到硬盘上需要几分钟到几十分钟,足够我吃一顿饭;而从网上下载一部电影,有时需要几个小时,我可…

    Linux 2023年5月27日
    0103
  • Linux上传下载神器之 lrzsz

    在开发的过程中,经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时,一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能解决问题,但是…

    Linux 2023年6月13日
    091
  • mybatis-plus详细讲解

    本文笔记都是观看狂神老师视频手敲的,视频地址:https://www.bilibili.com/video/BV17E411N7KN 学java后端的都可以去看一下,从基础到架构很…

    Linux 2023年6月7日
    0124
  • 为知笔记迁移到印象笔记-从入门到放弃

    最新进展 已经放弃了,目前正在逐步把笔记迁移到本地,用icloud来同步。 为什么放弃迁移? 没有找到好的迁移方案,迁移过去文档不方便查找和使用 为什么放弃印象笔记? 1.主要使用…

    Linux 2023年6月14日
    091
  • 运算符重载和深浅拷贝

    对于某些运算符号(+,-,,/….),我们不满足与它原有的操作方式,而是要在对 特有对象(如负数的加减)进行使用,但是编译器会不允许这样做,因为会与操作符 原本的类型不…

    Linux 2023年6月7日
    099
  • 【深度学习】神经网络前向传播简单实现

    步骤 输入层的每个节点与隐藏层的每个节点做点对点计算,加权求和 + 激活函数 利用同样的方法,计算隐藏层到输出层 隐藏层对加权结合后的结果使用激活函数,本例使用Sigmoid 最终…

    Linux 2023年6月13日
    0106
  • ShardingSphere-proxy-5.0.0分布式哈希取模分片实现(四)

    一、说明 主要是对字符串的字段进行hash取模 二、修改配置文件config-sharding.yaml,并重启服务 # Licensed to the Apache Softwa…

    Linux 2023年6月14日
    081
  • linux安装Oracle11G

    1、Linux下以Oracle帐户进入Linux系统。 2、执行以下命令查看数据库监听器的状况: lsnrctl status 3、执行以下命令停止数据库监听器运行: lsnrct…

    Linux 2023年6月13日
    080
  • Spring事务(三)-事务失效场景

    有时候,我们明明在类或者方法上添加了 @Transactional注解,却发现方法并没有按事务处理。其实,以下场景会导致事务失效。 1、事务方法所在的类没有加载到Spring IO…

    Linux 2023年6月6日
    097
  • gcc/g++与动静库以及gdb

    gcc/g++ 程序转换为二进制 总共需要经过4个大步骤:1.预处理,2.编译,3.汇编,4.链接。 想要更深刻的了解它,可以通过Linux去深刻的了解他们。 先创建.C文件 并且…

    Linux 2023年6月13日
    092
  • Windows 添加nginx到服务

    一、下载nginx 地址:http://nginx.org/en/download.html (稳定版) 解压到相应的磁盘,本文是:E:\nginx\nginx-1.18.0 二、…

    Linux 2023年6月8日
    0114
  • cdn缓存顺序优先级

    posted @2022-09-26 17:28 爱折腾的大臭臭 阅读(10 ) 评论() 编辑 Original: https://www.cnblogs.com/linuxsh…

    Linux 2023年6月6日
    0118
  • Linux基础入门笔记

    Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统,是一…

    Linux 2023年6月14日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球