【问题标题】:How to use local nuget package sources for Dockerfile dotnet restore [duplicate]如何使用本地 nuget 包源进行 Dockerfile dotnet restore [重复]
【发布时间】:2019-03-17 04:18:24
【问题描述】:

我正在尝试使用本地 nuget 包进行 dotnet 还原,我尝试按照本教程进行操作:dotnet restore w/out internet

我的问题:

即使它存在于该路径上,它也看不到该路径。。

我使用的服务器位于公司网络上,这就是我无法使用 dotnet restore 的原因,所以我也遇到了与 link 类似的 nuget.org 问题。

环境:

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

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

2018 年 10 月 15 日更新

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

【问题讨论】:

    标签: docker .net-core dockerfile


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

    这可以解决过多的恢复时间,例如在自动构建期间。

    要解决您的网络问题,您可以尝试在解决步骤期间挂载网络补丁而不是本地路径,或者先将公司网络中的文件 robocopy 到本地缓存中。

    【讨论】:

      【解决方案2】:

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

      特别是:

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

      【讨论】:

      • 感谢您的回答。只是想知道共享驱动器是否也适用于 Docker EE(无 UI)。我现在正在尝试您的建议,并且还在谷歌上搜索共享驱动器的 docker 命令。
      • 我不在 Windows 上使用 docker。我不能说出确切的步骤,但请仔细检查是否明确需要共享 C: 驱动器。谷歌搜索说一些最新版本的 Docker EE + Windows 2016 不需要这一步。
      【解决方案3】:

      一个更简单的替代方法是将 NuGet 包缓存在单独的层中,方法是在复制源文件之前从 csproj 项目文件中恢复它们。示例:

      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 会触发正在重建的层,但这应该比重建容器的频率低。

      【讨论】:

        【解决方案4】:

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

        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,一切都会得到解决

        【讨论】:

          猜你喜欢
          • 2021-08-16
          • 1970-01-01
          • 2018-02-04
          • 2019-04-26
          • 1970-01-01
          • 1970-01-01
          • 2019-12-19
          • 1970-01-01
          • 2020-08-08
          相关资源
          最近更新 更多