當前位置: 妍妍網 > 碼農

Asp-Net-Core開發筆記:使用Alpine基礎映像並加入健康檢查

2024-04-21碼農

前言

使用 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 部署,詳見之前的文章:

換成 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
EXPOSE80
EXPOSE443
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