如何用.NET 8 dotnet publish命令构建多架构Docker容器及GitHub Actions实现
使用.NET 8的dotnet publish构建多架构Docker容器
一、本地构建多架构镜像方案
.NET 8的dotnet publish /t:PublishContainer支持直接生成多架构Docker镜像,核心依赖Docker Buildx功能(需确保本地Docker已启用该功能)。以下是可直接运行的命令格式:
dotnet publish ./Wowshop.API/Wowshop.API.csproj /t:PublishContainer \ -r linux-x64 -r linux-arm64 \ -p:ContainerImageName=wowshop-api \ -p:ContainerRegistry=your-registry.io
关键参数说明
- 多个目标架构需用独立的
-r参数指定(而非分号分隔),.NET 8会自动调用Docker Buildx完成多架构构建 -p:ContainerImageName:自定义镜像名称-p:ContainerRegistry:指定镜像仓库地址(如需要推送到远程仓库)- 若要直接推送镜像到仓库,追加
-p:ContainerPush=true参数即可:
dotnet publish ./Wowshop.API/Wowshop.API.csproj /t:PublishContainer \ -r linux-x64 -r linux-arm64 \ -p:ContainerImageName=wowshop-api \ -p:ContainerRegistry=your-registry.io \ -p:ContainerPush=true
二、GitHub Actions多架构构建流程
以下是完整的工作流配置,实现代码推送时自动构建并推送多架构镜像:
name: Build Multi-Arch Docker Image on: push: branches: [ main ] tags: [ v* ] env: IMAGE_NAME: wowshop-api REGISTRY: ghcr.io OWNER: ${{ github.repository_owner }} jobs: build-and-push: runs-on: ubuntu-latest steps: # 1. 检出代码 - name: Checkout code uses: actions/checkout@v4 # 2. 安装.NET 8 SDK - name: Setup .NET 8 uses: actions/setup-dotnet@v4 with: dotnet-version: 8.x # 3. 登录到容器仓库(以GHCR为例) - name: Login to GHCR uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # 4. 构建并推送多架构镜像 - name: Build and push multi-arch image run: | dotnet publish ./Wowshop.API/Wowshop.API.csproj /t:PublishContainer \ -r linux-x64 -r linux-arm64 \ -p:ContainerImageName=${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }} \ -p:ContainerPush=true \ -p:ContainerTags=${{ github.sha }},latest${{ startsWith(github.ref, 'refs/tags/') && ',' || '' }}${{ github.ref_name }} # 5. 可选:验证镜像架构 - name: Verify multi-arch image run: | docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:latest
流程说明
- 触发条件:代码推送到
main分支或创建版本标签时自动执行 - 环境变量:统一管理镜像名、仓库地址等参数,便于维护
- 登录环节:利用GitHub内置的
GITHUB_TOKEN完成GHCR仓库的身份验证 - 标签逻辑:自动为镜像添加提交SHA、
latest标签,若为标签触发则追加版本号标签
内容的提问来源于stack exchange,提问作者Kuzon
相关产品推荐
相关产品推荐

