如何使用本地nuget软件包源进行Dockerfile dotnet还原

时间:2018-10-12 01:26:30

标签: docker .net-core dockerfile

我正在尝试使用本地nuget软件包进行dotnet还原,我尝试遵循本教程:dotnet restore w/out internet

我的问题:

即使该路径上存在该路径也看不到它。click for image

我正在使用的服务器位于公司网络上,这就是为什么我不能使用dotnet restore的原因,所以我也遇到了类似于link的nuget.org问题。

环境:

对于示例项目,我使用了:

  • Visual Studio 2017中的基本.Net Core Web应用程序
  • Docker企业版(无UI),Windows容器
  • Windows Server 2016作为操作系统。

更新10/15/2018

尽管@omajid的答案非常有帮助,但我相信只有在使用docker run时才可能进行docker卷挂载,并且不能在Dockerfile中使用(将用于Build Pipeline)。得到了与我想要实现的链接类似的链接。 How to mount a host directory in a Docker container

4 个答案:

答案 0 :(得分:1)

docker和容器技术的整个卖点是隔离。因此,在Docker容器中,您的用户磁盘不可见。如果是这样,那么隔离将少得多。您需要在容器内挂载本地nuget目录才能访问它。有关详细步骤,请参见https://rominirani.com/docker-on-windows-mounting-host-directories-d96f3f056a2c

尤其是:

  • 共享您的C:驱动器
  • 在您的Dockerfile中,有一个dotnet restore --source /packages
  • 使用卷装将本地软件包安装到容器/packages内的docker build -t webapp4 . -v c:/users/cnaling/.nuget/packages:/packages

答案 1 :(得分:1)

要准备好所有软件包,需要在构建之前进行还原。 要在构建过程中拥有所有软件包,您需要复制这些软件包。

以下是一个实验形式的示例:

准备工作:

准备好SDK:docker pull microsoft/dotnet:2.2-sdk

已准备好src/src.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
  </ItemGroup>
</Project>

已准备好src/Dockerfile

FROM microsoft/dotnet:2.2-sdk AS byse
COPY packages /root/.nuget/packages
COPY src src
RUN ls /root/.nuget/packages
WORKDIR /src
RUN dotnet restore
RUN ls /root/.nuget/packages

执行:

还原软件包:

docker run --rm -v $(pwd)/src:/src -v $(pwd)/packages:/root/.nuget/packages -w /src  microsoft/dotnet:2.2-sdk dotnet restore

构建图像:

docker build -t test -f src/Dockerfile .

期望:

Sending build context to Docker daemon  13.77MB
Step 1/7 : FROM microsoft/dotnet:2.2-sdk AS byse
 ---> e4747ec2aaff
Step 2/7 : COPY packages /root/.nuget/packages
 ---> 76c3e9869bb4
Step 3/7 : COPY src src
 ---> f0d3f8d9af0a
Step 4/7 : RUN ls /root/.nuget/packages
 ---> Running in 8323a9ba8cc6
newtonsoft.json
Removing intermediate container 8323a9ba8cc6
 ---> d90056004474
Step 5/7 : WORKDIR /src
 ---> Running in f879d52f81a7
Removing intermediate container f879d52f81a7
 ---> 4020c789c338
Step 6/7 : RUN dotnet restore
 ---> Running in ab62a031ce8a
  Restore completed in 44.28 ms for /src/src.csproj.
Removing intermediate container ab62a031ce8a
 ---> 2cd0c01fc25d
Step 7/7 : RUN ls /root/.nuget/packages
 ---> Running in 1ab3310e2f4c
newtonsoft.json
Removing intermediate container 1ab3310e2f4c
 ---> 977e59f0eb10
Successfully built 977e59f0eb10
Successfully tagged test:latest

请注意,ls步骤已缓存,不会在后续调用中显示。运行docker rmi test重置。

步骤4/7在还原之前已经运行,并且程序包已经被缓存。

Step 4/7 : RUN ls /root/.nuget/packages
 ---> Running in 8323a9ba8cc6
newtonsoft.json

这可以解决过多的还原时间,例如在自动构建过程中。

要解决您的网络问题,您可以尝试在解决步骤中挂载网络修补程序而不是本地路径,或者先将公司网络中的文件自动复制到本地缓存中。

答案 2 :(得分:1)

一个更简单的选择是通过在复制源文件之前从csproj项目文件中还原NuGet软件包,将它们保存在单独的层中。示例:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./

RUN dotnet publish -c Release -o out

此解决方案应加快本地开发的速度,这通常需要相当多的stop-> build-> up个周期。

主要缺点是,更改csproj会触发正在重建的图层,但这要比重建容器的发生频率更低。

答案 3 :(得分:0)

我玩游戏有点迟了,但是我相信我找到了解决这个问题的简单方法...

  1. 在与.sln相同的目录中创建“ NuGet.Config”文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="{{CUSTOM NAME}}" value="{{CUSTOM SOURCE}}" />
  </packageSources>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <add key="skip" value="False" />
  </bindingRedirects>
  <packageManagement>
    <add key="format" value="0" />
    <add key="disabled" value="False" />
  </packageManagement>
</configuration>
  1. 就是这样!在这里也创建您的“ Dockerfile”

  2. 使用Dockerfile运行docker build,所有问题都会解决