跳到主要内容

10.2 Docker 与 CI/CD

Docker 让运行环境可复制,CI/CD 让构建、测试和发布可重复。对就业项目来说,能展示自动化交付流程会明显提升项目可信度。

学习目标

  • 能为 ASP.NET Core API 编写多阶段 Dockerfile。
  • 能理解镜像、容器、端口和环境变量。
  • 能设计最小 CI 流程:恢复依赖、构建、测试、发布产物。
  • 能避免把密钥写进镜像或仓库。

应用场景

  • 本地用容器启动 API 和数据库。
  • 在 CI 中执行 dotnet testnpm run build
  • 发布后端镜像到容器平台。
  • 用环境变量控制连接字符串和运行环境。

Dockerfile 示例

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

COPY . .
RUN dotnet restore
RUN dotnet publish src/TodoApp.Api/TodoApp.Api.csproj -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .

ENV ASPNETCORE_URLS=http://+:8080
EXPOSE 8080

ENTRYPOINT ["dotnet", "TodoApp.Api.dll"]

CI 流程示例

name: build

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'
- uses: actions/setup-node@v4
with:
node-version: '24'
- run: dotnet restore
- run: dotnet build --configuration Release --no-restore
- run: dotnet test --configuration Release --no-build
- run: npm ci
working-directory: frontend
- run: npm run build
working-directory: frontend

重点难点

  • 镜像构建时不要复制本地密钥文件。
  • 生产连接字符串通过环境变量或密钥服务注入。
  • CI 要先快后慢,先格式/构建/单元测试,再跑集成测试。
  • Dockerfile 的目标框架版本要和项目目标框架一致。

常见误区

误区推荐做法
直接在服务器手动复制文件使用可重复的 publish 或镜像流程
镜像中包含源码和 SDK使用多阶段构建,只保留运行时产物
CI 只做部署不跑测试先测试通过再发布

练习

  • 为 Todo API 写一个 Dockerfile。
  • 用环境变量覆盖连接字符串。
  • 写一个 GitHub Actions 流程运行 dotnet test 和前端构建。