You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用本地文件共享NuGet包将.NET Core Docker容器部署到Azure

解决方案

前置调整

你当前BuildDockerImage阶段使用的是微软托管的Ubuntu镜像,默认无法访问你内网的网络共享路径,首先需要将该阶段的代理池替换为和CI阶段一致的私有AppDev池,该池的运行代理已经具备内部共享路径的访问权限,调整后的yaml对应片段如下:

- stage: "BuildDockerImage"
  pool: AppDev # 替换原来的vmImage配置
  condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'),eq(variables['Build.SourceBranch'], 'refs/heads/master'))
  jobs:
    - job: buildImageRelease
      pool: AppDev # 同样替换
      steps:
      # 后续步骤

方案一:复制本地包到构建上下文(推荐,无额外权限依赖)

该方案直接将内部NuGet包同步到Docker构建上下文,不需要额外调整Docker构建权限,兼容性最好。

  • 第一步:在Docker@2任务前添加文件同步步骤,将网络共享路径的NuGet包复制到构建上下文的LocalNuget目录,同时复制根目录的Nuget.config到构建上下文根路径:
# 插入到Docker任务之前
- task: CopyFiles@2
  inputs:
    SourceFolder: '//你的网络共享路径/NugetPackages' # 替换为你实际的共享路径,Windows为Z:\xxx格式
    Contents: '*.nupkg'
    TargetFolder: '$(Build.SourcesDirectory)/src/LocalNuget'
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/src'
    Contents: 'Nuget.config'
    TargetFolder: '$(Build.SourcesDirectory)/src'
  • 第二步:调整Nuget.config配置,添加本地包源指向:
<packageSources>
  <add key="LocalNuget" value="./LocalNuget" />
  <!-- 其他公开源配置保留 -->
</packageSources>
  • 第三步:修改Dockerfile,在dotnet restore前提前复制配置和包目录,restore时指定配置文件:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
# 提前复制Nuget配置和本地包目录
COPY ["Nuget.config", "./"]
COPY ["LocalNuget", "./LocalNuget"]
COPY ["Contacts/contacts.csproj", "Contacts/"]
COPY ["Contracts/Contracts.csproj", "Contracts/"]
COPY ["Handlers/Handlers.csproj", "Handlers/"]
COPY ["Infrastructure/Infrastructure.csproj", "Infrastructure/"]
# restore时指定配置文件
RUN dotnet restore "Contacts/contacts.csproj" --configfile Nuget.config
# 后续步骤保持不变

方案二:构建时挂载共享卷(适合包体积大的场景)

该方案不需要重复复制包,直接将代理挂载的共享路径透传到构建容器中:

  • 第一步:提前在私有代理节点上将网络共享路径挂载为固定路径,比如Linux下挂载到/mnt/local-nuget,Windows下挂载为Z:\LocalNuget,给代理运行账号开通读取权限。
  • 第二步:将原来的Docker@2任务替换为手动执行docker build命令,指定挂载参数:
# 替换原来的Docker@2任务
- script: |
    docker build -f ./src/Contacts/Dockerfile \
    --mount type=bind,source=/mnt/local-nuget,target=/mnt/local-nuget,readonly \
    -t $(dockerimage):$(Build.BuildNumber) \
    ./src
  displayName: '构建Docker镜像'
- script: |
    docker push $(dockerimage):$(Build.BuildNumber)
  displayName: '推送镜像到镜像仓库'
  • 第三步:修改Dockerfile的restore步骤,指定挂载的内部源:
RUN dotnet restore "Contacts/contacts.csproj" -s /mnt/local-nuget -s https://api.nuget.org/v3/index.json

注意事项

  • 若内部NuGet源需要认证,不要将明文凭证写入配置文件,可通过Azure Pipelines秘密变量传递,在restore命令中通过--username和--password参数传入。
  • 若使用Windows代理,挂载卷时路径格式需要调整为Windows兼容的格式。

内容的提问来源于stack exchange,提问作者Christophe Loeys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:45:03