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

前言

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

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

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

添加健康检查

注册服务

c# 复制代码
builder.Services.AddHealthChecks();

配置中间件

c# 复制代码
app.MapHealthChecks("/healthz");

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

修改 docker-compose

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

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

yaml 复制代码
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 就行了

dockerfile 复制代码
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 这个运行时,然后重新发布

bash 复制代码
dotnet publish -r linux-musl-x64

搞定~

参考资料

相关推荐
Hello.Reader22 分钟前
Ubuntu 上正确安装 Kali 虚拟机、Docker 与 kail 工具指南
linux·ubuntu·docker
筱_智1 小时前
Docker学习-超详细-通俗易懂(从入门到精通)
学习·docker·容器
njsgcs1 小时前
solidworks自动标注折弯4 无向图 c#
开发语言·c#·solidworks
EAIReport2 小时前
Docker与K8s核心解析:共同性、差异性及实战适配指南
docker·容器·kubernetes
我是唐青枫2 小时前
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
c#·.net
江湖有缘2 小时前
容器化部署|Docker搭建Blinko轻量笔记系统
笔记·docker·容器
炸裂狸花猫4 小时前
开源身份认证与访问管理平台 - Keycloak(二)
docker·云原生·容器·kubernetes·开源·keycloak·sso
JQLvopkk4 小时前
C# 工业级上位机:交互实战
开发语言·c#·交互
炸裂狸花猫4 小时前
开源身份认证与访问管理平台 - Keycloak(一)
docker·云原生·kubernetes·开源·devops
rustfs4 小时前
MinIO 国产平替,RustFS 发布 Beta 版本啦
分布式·docker·云原生·rust·开源