使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure

Posted

技术标签:

【中文标题】使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure【英文标题】:Deploy .NET Core docker container to Azure with nugets in local fileshare 【发布时间】:2021-10-24 12:59:42 【问题描述】:

我们有一个 Azure Pipelines 的本地实例,我正在尝试通过它构建一个 .NET Core 应用程序并为其构建一个 docker 容器。我们过去已经这样做了,但是我对 docker 和 azure 管道还是很陌生,我遇到了一个问题,即容器内的 dotnet restore 命令失败,因为它找不到我们的本地包。我们将内部 NuGet 包存储在网络共享上,但我不确定如何创建我的配置以便它可以获取这些包。

这是我们的 .yaml 文件阶段在不使用本地包时的样子:

stages:
  - stage: "CI"
    pool: AppDev
    jobs:
    - job: buildAndTest
      workspace:
        clean: all
      steps:
      - task: UseDotNet@2
        displayName: 'Use .Net Core sdk 3.1.100'
        inputs:
          version: 3.1.301
          includePreviewVersions: false    
      - task: DotNetCoreCLI@2
        displayName: 'dotnet restore'
        inputs:
          command: restore
          projects: '**/*.sln'
          selectOrConfig: config
          nugetConfigPath: $(Build.SourcesDirectory)/src/Nuget.config
      - task: DotNetCoreCLI@2
        displayName: 'dotnet build'
        inputs:
          projects: '**/*.sln'
      - task: DotNetCoreCLI@2
        displayName: 'dotnet test'
        inputs:
          command: test
          projects: '**/*Test*.csproj'
          testRunTitle: 'Testrun'
  - stage: "BuildDockerImage"
    pool:
      vmImage: ubuntu-18.04
    condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'),eq(variables['Build.SourceBranch'], 'refs/heads/master'))
    jobs:
      - job: buildImageRelease
        pool:
          vmImage: ubuntu-18.04
        steps:
        - task: Docker@2
          inputs:
            containerRegistry: DockerImageRepo
            repository: $(dockerimage)
            buildContext: src
            tags: $(Build.BuildNumber)

码头文件:

FROM alpine:latest AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Contacts/contacts.csproj", "Contacts/"]
COPY ["Contracts/Contracts.csproj", "Contracts/"]
COPY ["Handlers/Handlers.csproj", "Handlers/"]
COPY ["Infrastructure/Infrastructure.csproj", "Infrastructure/"]
RUN dotnet restore "Contacts/contacts.csproj"
COPY . .
WORKDIR "/src/Contacts"
RUN dotnet build "contacts.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "contacts.csproj" -r linux-musl-x64 --self-contained true -c Release /p:PublishTrimmed=true -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["./contacts", "--urls", "http://0.0.0.0:80"]

您可以怀疑,docker 任务在 dotnet restore 行失败。

我正在考虑将网络共享安装为一个卷,然后添加 nuget 包源,但我不知道如何执行此操作。

【问题讨论】:

是的,从 docker 文件中的本地和私有经过身份验证的 nuget 提要恢复 nuget 是一件很痛苦的事情,以及管道构建和容器产生的许多其他复杂性。就我个人而言,在我所有的管道中,我都在管道本身中构建并复制,没有大惊小怪,大大简化了 docker 文件,并且几年又回到了我的生活中 @TheGeneral 听起来确实是最简单的解决方案...我只需要添加一个 dotnet 发布步骤,然后在我的 dockerfile 中复制该输出,对吗? 你甚至可以在管道中发布你需要做的任何事情,只需将生成的目录复制到它需要去的地方。例如 COPY bin/Release/net5.0/ubuntu.18.04-x64 /app 假设你的 docker 文件在你的项目中 对不起,我看错了你的评论,是的,这是正确的 【参考方案1】:

构建时可以将 pkg 和 nuget.config 复制到镜像中

COPY ["mypackage.nupkg", "/packages"]
COPY nuget.config . 

nuget.config 的内容必须等同于

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <packageSources>
        <add key="local" value="./packages" />
    </packageSources>
    
</configuration>

见Microsoft NuGet.config File Reference

【讨论】:

以上是关于使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 url 下载到 .Net Core 中的本地设备

我们可以在 .net core 3.1 中一次性上传多少大文件到 Azure 文件共享

如何在 ASP.NET Core 项目中读取本地文件?

Asp.net core 3.1 解密 CryptoStream 得到“输入数据不是一个完整的块”

如何通过 NuGet 包共享源代码以用于 .NET Core 项目

ASP.Net Core“找不到此本地主机页面”HTTP ERROR 404