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

jra*_*er4 5 docker .net-core dockerfile

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

我的问题:

即使它存在于该路径上,它也看不到该路径。点击图片.

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

环境:

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

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

更新 10/15/2018

虽然@omajid 的回答非常有帮助,但我相信 docker volume mount 仅在使用 docker run 时才可能,不能在 Dockerfile(将用于构建管道)中使用。得到了与我想要实现的类似的链接。如何在 Docker 容器中挂载主机目录

Joh*_*nes 5

要准备好所有包,您需要在构建之前进行恢复。要在构建期间拥有所有包,您需要复制这些包。

这是一个实验形式的例子:

准备:

准备好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>
Run Code Online (Sandbox Code Playgroud)

准备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
Run Code Online (Sandbox Code Playgroud)

执行:

恢复包:

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

构建图像:

docker build -t test -f src/Dockerfile .
Run Code Online (Sandbox Code Playgroud)

期待:

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
Run Code Online (Sandbox Code Playgroud)

请注意,ls 步骤会被缓存,并且不会在后续调用中打印。运行docker rmi test重置。

步骤 4/7 在恢复之前运行,并且包已被缓存。

Step 4/7 : RUN ls /root/.nuget/packages
 ---> Running in 8323a9ba8cc6
newtonsoft.json
Run Code Online (Sandbox Code Playgroud)

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

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


归档时间:

查看次数:

10932 次

最近记录:

5 年,1 月 前