介紹
.NET 8 無需 DockerFile 即可爲 .NET 應用創建 docker 映像的新方法,我將使用 dotnet publish 將 .NET 應用容器化,在本文中,我將分享我如何爲.NET 8的項目創建一個簡單的 ci/cd 的經驗。它包括 2 個主題:
- 創建用於生成 .NET 應用並將其發佈到 Azure 的 GitHub 工作流
- 如何使用 dotnet publish 的新功能創建 docker 映像的示例。
先決條件
- 已安裝 .NET 8 SDK
- 已安裝 Docker
- Azure 訂閱。您可以獲得免費訂閱,這將綽綽有餘
- Github 帳戶
- Docker Hub 帳戶
使用Visual studio 2022或者是Visual studio code 創建 .NET 8 WEB API 項目 dotnetapi:
───dotnetapi
├───dotnetapi.sln
└───dotnetapi.csproj
└───其他文件
dotnet publish 現在可以在沒有 docker 文件的情況下創建映像。您可以在官方文檔中找到配置 docker 鏡像所需的一切。
dotnet publish /t:PublishContainer -r linux-x64 (確保在項目目錄下運行此命令)
運行該命令後,應在本地 docker 中心創建新Image。默認情況下,Image 名稱將等於項目名稱,這裏還要提一下的是 dotnet publish 現在默認在Release模式下發布應用。可以在 .csproj 文件中更改其名稱。將新設置添加到 .csproj 文件以修改生成的映像名稱:
<ContainerRepository>yizhanshop</ContainerRepository>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<UserSecretsId>9d475c4e-a0e9-42ab-acc1-e54efb654a06</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>.</DockerfileContext>
<ContainerRepository>yizhanshop</ContainerRepository>
再次運行 dotnet publish 並確保創建名爲“yizhanshop”的新Image,在本地 docker 容器中運行我們的Image :
docker run -p 5000:8080 --rm yizhanshop
轉到瀏覽器中的 http://localhost:5000/,並確保 API 正在運行。
將鏡像推送到 docker hub
- 轉到 docker hub 並生成一個新令牌(如果已有令牌,可以使用現有令牌)。
- 使用您的 Docker Hub 用戶名和令牌(剛剛生成)登錄 Docker Hub
docker login -u <YOUR_USERNAME>
- 使用您的用戶名標記圖像
docker tag yizhanshop <YOUR_USERNAME>/yizhanshop
- 將鏡像推送到 docker hub
docker push <YOUR_USERNAME>/yizhanshop
創建 Azure 應用服務Create Azure App Service
現在,已在專用容器註冊表中創建Image,並已準備好將此映像部署到應用服務容器。我們將使用 Linux 容器,現在轉到 https://portal.azure.com/#create/Microsoft.WebSite 並使用 Linux 容器創建新的 Web 應用。
創建 Github 工作流
現在,將存儲庫推送到 GitHub並創建基本的Build工作流。我們可以從預定義的 GitHub 工作流開始,用於構建 .net 應用。轉到“Actions”並搜索“.net”。應會看到 .net 模板
修改 .net 版本以使用 .net 8 並提交到主分支,現在的內容如下:
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: .NET
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
env:
yizhanshop_image: '${{ secrets.DOCKER_HUB_USERNAME }}/yizhanshop'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore dotnetapi/dotnetapi.sln
- name: Build
run: dotnet build --no-restore dotnetapi/dotnetapi.sln
- name: Test
run: dotnet test --no-build --verbosity normal dotnetapi/dotnetapi.sln
將機密添加到存儲庫
現在,我們需要將 Docker hub 令牌和用戶名添加到存儲庫機密中,以便我們可以在管道中執行“docker login”。
轉到設置 => security: secrets and variables => Actions: New repository secret:
DOCKER_HUB_USERNAME => 您的 docker hub 用戶名
DOCKER_HUB_USERNAME =>您的 docker hub 令牌
此外,還需要添加應用服務發佈配置文件。
轉到應用服務 https://portal.azure.com/ 並下載發佈配置文件:
添加新密鑰
AZURE_WEBAPP_PUBLISH_PROFILE ->粘貼從 Azure 下載的字符串。
此外,添加一個變量 (不是SECRET) ,用於指示 Azure Web 應用名稱。就我而言,這是“yizhanshop”
AZURE_WEBAPP_NAME => 它應等於 Web 應用的“名稱”
修改工作流以自動推送新圖像
- 首先,不要忘記將 github 所做的更改自動拉取到本地存儲庫
- 轉到 .github/workflows/dotnet.yml,讓我們稍微修改一下創建的工作流
讓我們添加一些變量
env:
yizhanshop_image: '${{ secrets.DOCKER_HUB_USERNAME }}/yizhanshop'
添加將創建 docker Image的步驟,並更改映像名稱的步驟,以便我們可以將其推送到我們的 docker hub 容器註冊表,登錄到 docker hub,將鏡像推送到 docker
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore dotnetapi/dotnetapi.sln
- name: Build
run: dotnet build --no-restore dotnetapi/dotnetapi.sln
- name: Test
run: dotnet test --no-build --verbosity normal dotnetapi/dotnetapi.sln
- name: Create Docker Image
run: dotnet publish ./dotnetapi/dotnetapi.csproj /t:PublishContainer -r linux-x64
- name: change image tag
run: docker tag yizhanshop ${{ env.yizhanshop_image }}
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Docker Push
run: docker push ${{ env.yizhanshop_image }}
你可以試試。當對 PR 進行任何更改時,應觸發流水線 main或 main分支本身。 如果更改未反映在 Azure Web 應用中,可以嘗試重啓它。
總結
您可以在 GitHub 存儲庫中找到我使用的所有代碼:https://github.com/geffzhang/dotnetapi,在本文中,我想分享如何使用Github Action 工作流將.NET 8應用 部署到 Azure Web 容器應用的經驗。