首页 > 其他分享 >将 .NET 8应用 以 dotnet publish 创建容器镜像并结合 Github Actions 部署到 Azure 应用服务容器

将 .NET 8应用 以 dotnet publish 创建容器镜像并结合 Github Actions 部署到 Azure 应用服务容器

时间:2024-01-20 23:34:31浏览次数:44  
标签:容器 Github name publish dotnetapi dotnet docker NET yizhanshop

介绍

.NET 8 无需 DockerFile 即可为 .NET 应用创建 docker 映像的新方法,我将使用 dotnet publish 将 .NET 应用容器化,在本文中,我将分享我如何为.NET 8的项目创建一个简单的 ci/cd 的经验。它包括 2 个主题:

  • 创建用于生成 .NET 应用并将其发布到 Azure 的 GitHub 工作流
  • 如何使用 dotnet publish 的新功能创建 docker 映像的示例。

先决条件

使用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 模板

image

修改 .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/ 并下载发布配置文件:

image

添加新密钥

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 应用中,可以尝试重启它。

image

总结

您可以在 GitHub 存储库中找到我使用的所有代码:https://github.com/geffzhang/dotnetapi,在本文中,我想分享如何使用Github Action 工作流将.NET 8应用 部署到 Azure Web 容器应用的经验。

标签:容器,Github,name,publish,dotnetapi,dotnet,docker,NET,yizhanshop
From: https://www.cnblogs.com/shanyou/p/17977364

相关文章

  • 容器管理工具Containerd
    一、Containerd介绍1.前言早在2016年3月,Docker1.11的DockerEngine里就包含了containerd,而现在则是把containerd从DockerEngine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在DockerEngine里containerd相比,独......
  • 云计算-代码开发流水线及CCE容器集群使用案例
    总结自己在使用华为云商业CI/CD代码流水和CCE容器集群部署案例学无止尽啊新项目构建镜像使用华为codearts代码流水线,详细见官方文档https://support.huaweicloud.com/productdesc-devcloud/devcloud_pdtd_00000.html以部署report-service构建测试镜像为例dockerfile文件前端FRO......
  • 如何恢复已经删除的 docker 容器的数据
    前言使用docker自带的volume机制进行数据的持久化,docker会在宿主机的特定位置(/var/lib/docker/volumes)维护各个volumes,面对容器删除的问题,有如下几个结论:容器启动(dockerrun)时,即使没有显示的指定-v-mount参数,容器的相关数据已经被作为volumes持久化存储了,比如在/var/li......
  • Spring IOC 容器加载过程详解
    在Spring框架中,IOC(InversionofControl)容器是核心的概念之一。IOC容器负责管理和装配各个组件,本文将详细介绍SpringIOC容器的加载过程,包括如何配置、初始化和装配Bean。1.什么是IOC容器IOC容器是Spring框架的一个关键组件,负责管理Java对象的生命周期、配置信息以及对象之间的......
  • node-sass 安装出错 Cannot download "https://github.com/sass/node-sass...
    Downloadingbinaryfromhttps://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-83_binding.nodeCannotdownload"https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-83_binding.node": github网站大多时候都访问不到,下载 win32-x......
  • 【github】Mac系统中,如何项目clone(1.通过vscode链接github,2.进行clone)
     1.通过vscode打开一个空文件夹(目录:确认想要放置新项目的目录)2.进行vscode和github的链接1)参考下方网址1-6步,生成sshkey,登录到github,检测SSHkeyhttps://cloud.tencent.com/developer/article/1952247,网址中有效内容如下:1.检查SSHkey是否存在在Mac终端输入:ls-a~/.......
  • Kubernetes容器实践操作深度解析
    Kubernetes容器实践深度解析引言在当今云原生时代,容器技术已经成为构建、部署和管理应用程序的关键工具之一。而在众多的容器编排系统中,Kubernetes(简称K8s)因其强大的自动化、弹性和可扩展性而备受欢迎。本文将深入探讨Kubernetes容器实践,从基础概念到高级应用,为读者提供全面的指南......
  • GitHub DeskTop 汉化教程
    参考文章:GithubDesktop汉化(最新版,支持Win、Mac、Linux平台)下载安装GitHubDeskToGitHubDeskTop官网下载地址:https://desktop.github.com/到官网下载并安装GitHubDeskTop,安装的时候要用默认路径!!!安装的时候要用默认路径!!!安装的时候要用默认路径!!!下载汉化工具GitHubDeskTop......
  • k8s解决容器中运行jar包时区不一致问题
    在k8s的容器中运行jar包时,发现启动的时间与实际时间不一致,导致一些对时间戳有要求的请求失败1.检查容器是否正确挂在宿主机上的/usr/share/zoneinfo/Asia/Shanghai文件containers:volumeMounts:-name:timezonemountPath:/etc/......
  • Android studio 集成github copilot
    AndroidStudio集成GitHubCopilot引言在软件开发的过程中,编写代码是一个不可避免的环节。而对于一些常见的代码块,我们可能已经写了很多次。在这种情况下,GitHubCopilot可以成为我们的好帮手。GitHubCopilot是由GitHub开发的人工智能代码助手,它通过学习开源代码库中的代码......