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)

大家都在看

  • Java动态脚本Groovy,高级啊!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 简介: Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编…

    Linux 2023年6月14日
    0128
  • JuiceFS 缓存预热详解

    缓存预热是一个比较常见的概念,相信很多小伙伴都有所了解。对于 JuiceFS 来说,缓存预热就是将需要操作的数据预先从对象存储拉取到本地,从而获得与使用本地存储类似的性能表现。 缓…

    Linux 2023年6月14日
    083
  • 使用Retrofit上传图片

    Retrofit使用协程发送请求参考文章 :https://www.cnblogs.com/sw-code/p/14451921.html 导入依赖 app的build文件中加入:…

    Linux 2023年6月8日
    0102
  • 创建镜像(alpine版)+alpine

    podman用脚本和dockerfile做apache编译安装镜像 1.0安装介质 2.0 特点 2.0 基础命令 3.0 模式 podman用脚本和dockerfile做apac…

    Linux 2023年6月7日
    076
  • SQLI-LABS(Less-9、10)

    Less-9(GET-Blind-Time based-Single Quotes) 打开 Less-9页面,可以看到页面中间有一句 Please input the ID as …

    Linux 2023年6月6日
    089
  • MySQL — 索引

    索引(Index)是高效获取数据的数据结构,就像书的目录,提高检索数据的效率。 优点:提高数据检索效率,降低数据库的 IO 成本;通过索引列对数据进行排序,降低数据排序的成本,降低…

    Linux 2023年6月8日
    066
  • 001 研发同学必学哪些 Linux 命令?

    身为研发同学,Linux 是绕不过去的一个小山包,不是说要掌握的十分精通,在程序员界里做个极客,也不是说要抢了 Devops 同学的饭碗,但至少要做到摆脱对 Linux 命令认知的…

    Linux 2023年5月27日
    080
  • Redis学习手册(Sorted-Sets数据类型)

    一、概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有…

    Linux 2023年5月28日
    074
  • 【凸优化】3 多面体,单纯形,半正定锥

    1 多面体 Polyhedra 定义:多面体为一系列的(有限个)线性等式和不等式的解集: [\mathcal{P}={x|a_j^T x \leq b_j, j=1,……

    Linux 2023年6月7日
    090
  • Redis 通过key前缀获取所有key的值

    Redis 通过key前缀获取所有key的值 public void getRedis(String cardId) { // 获取所有的key Set keys = redisT…

    Linux 2023年5月28日
    062
  • 十二、启动流程

    启动流程介绍 现代计算机系统启动是硬件与软件复杂组合。从定义的端点开始,到拥有登录提示符的运行中系统,需要大量的硬件和软件配合工作。以下列表从较高层面概述了启动系统时所涉及的任务。…

    Linux 2023年6月7日
    092
  • 对脱壳脚本的一些改进–识别出目标DEX

    一、前言 通常对于加壳的程序,第一步的操作通常是脱壳,而现在脱壳一般都选择利用 frida 来进行 hook 进行脱壳,不谈其他脱壳方式,利用 frida 脱壳原理大致分为两种: …

    Linux 2023年6月8日
    094
  • Guava中的封装的Map操作

    引入依赖 <dependency> <groupId>com.google.guavagroupId> <artifactId>guava…

    Linux 2023年6月7日
    098
  • cv2简单使用(opencv-python)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月14日
    064
  • python学习笔记1之-python简介及其环境安装

    python学习笔记之-python简介及其环境安装 最近几年python之火不用多说,最近开始利用时间自学python,在学习的过程中,按照自己的思路和理解记录下学习的过程,并分…

    Linux 2023年6月14日
    0127
  • Oracle中row_number()、rank()、dense_rank() 的区别

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行…

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