Asp-Net-Core開發筆記:使用alpine映象並加入健康檢查

程序设计实验室發表於2024-04-19

前言

使用 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

搞定~

參考資料

  • https://www.cnblogs.com/podolski/p/16603177.html

相關文章