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