使用本地文件共享中的块将 .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的主要内容,如果未能解决你的问题,请参考以下文章
我们可以在 .net core 3.1 中一次性上传多少大文件到 Azure 文件共享
Asp.net core 3.1 解密 CryptoStream 得到“输入数据不是一个完整的块”