【问题标题】:Deploy .NET Core docker container to Azure with nugets in local fileshare使用本地文件共享中的块将 .NET Core docker 容器部署到 Azure
【发布时间】: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 文件在你的项目中
  • 对不起,我看错了你的评论,是的,这是正确的

标签: c# azure docker .net-core nuget


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多