10.2 Docker 与 CI/CD
Docker 让运行环境可复制,CI/CD 让构建、测试和发布可重复。对就业项目来说,能展示自动化交付流程会明显提升项目可信度。
学习目标
- 能为 ASP.NET Core API 编写多阶段 Dockerfile。
- 能理解镜像、容器、端口和环境变量。
- 能设计最小 CI 流程:恢复依赖、构建、测试、发布产物。
- 能避免把密钥写进镜像或仓库。
应用场景
- 本地用容器启动 API 和数据库。
- 在 CI 中执行
dotnet test和npm 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和前端构建。