如何使用本地文件共享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
相关产品推荐
相关产品推荐

