• Asp-Net-Core开发笔记:使用alpine镜像并加入健康检查


    前言#

    使用 docker 部署 AspNetCore 应用已经是标配了,之前我一直使用 mcr.microsoft.com/dotnet/aspnet:8.0 这类镜像,简单粗暴,不过可以使用 alpine 进一步优化镜像大小。

    很多开源工具的 docker 都有健康检查,这次我顺便也给加上了。

    PS: 本文的例子项目来自一个差点被砍掉的项目「IdentityServerLite」,后面我会写个文章介绍一下~

    添加健康检查#

    注册服务

    builder.Services.AddHealthChecks();
    

    配置中间件

    app.MapHealthChecks("/healthz");
    

    之后测试一下,本地运行后访问 http://host:port/healthz 可以看到 Healthy 字样

    修改 docker-compose#

    在应用配置下面增加 healthcheck 配置

    这个镜像 mcr.microsoft.com/dotnet/aspnet 里自带了 wget ,所以直接用这个来请求健康检查接口就完事了,如果用 curl 还得去安装。

    version: '3.6'
    
    services:
      web:
        image: ${DOCKER_REGISTRY-}web
        container_name: ids-lite
        restart: always
        environment:
          - ASPNETCORE_ENVIRONMENT=Production
          - ASPNETCORE_URLS=http://+:80
        build:
          context: .
        volumes:
          - .:/app
        networks:
          - swag
        healthcheck:
          test: ["CMD-SHELL", "wget --spider http://localhost:80/healthz || exit"]
          interval: 10s
          timeout: 5s
          retries: 5
    
    networks:
      swag:
        name: swag
        external: true
    

    换成 alpine 基础镜像#

    还没有配置CICD之前,我使用了 FrameworkDependent 的方式来搭配 docker 部署,详见之前的文章: Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署

    换成 alpine 可以减少一半镜像体积,从 240MB 减少到 100MB 左右。

    修改 dockerfile

    8.0 后面加 -alpine 就行了

    FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
    RUN apk add --no-cache icu-libs
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443
    
    FROM base AS final
    WORKDIR /app
    COPY . .
    ENTRYPOINT ["./IdsLite.Api"]
    
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    

    重新发布#

    之前在本机发布的时候,运行时选的是 linux-x64

    这样发布出来的可执行文件是依赖 glibc 的

    但是 alpine 基础镜像里是 musl libc

    所以需要选择 linux-musl-x64 这个运行时,然后重新发布

    dotnet publish -r linux-musl-x64
    

    搞定~

    参考资料#

  • 相关阅读:
    【数据结构】C语言实现栈
    牛顿迭代法
    在Windows下用mingw手工编译程序
    谷粒商城项目-环境配置
    使用JPA和Hibernate查询分页
    AP5126 降压恒流 PIN对PIN替LN2566 LED汽车大灯车灯驱动芯片
    机器学习:基于AdaBoost算法模型对信用卡是否违约进行识别
    计算机网络基础导览
    Unity-资源异步加载
    ARM架构
  • 原文地址:https://www.cnblogs.com/deali/p/18147029