Как использовать локальные источники пакетов nuget для восстановления Dockerfile dotnet

Я пытаюсь использовать локальный пакет nuget для восстановления dotnet, я пытался следовать этому руководству: восстановление dotnet без интернета

Моя проблема:

Он не видит путь, даже если он существует на этом пути.нажмите для изображения,

Сервер, который я использую, находится в корпоративной сети, поэтому я не могу использовать восстановление dotnet, поэтому у меня также возникает проблема с nuget.org, похожая на эту ссылку.

Среда:

Для примера проекта я использовал:

  • базовое веб-приложение.Net Core из Visual Studio 2017
  • Docker Enterprise Edition (без пользовательского интерфейса), контейнер Windows
  • Windows Server 2016 как ОС.

ОБНОВЛЕНИЕ 15/15/2018

Хотя ответ @omajid был очень полезным, я считаю, что монтирование тома docker возможно только при использовании docker run и не может быть использовано в Dockerfile(который будет использоваться для Build Pipeline). Получил эту ссылку, которая похожа на то, что я хочу достичь. Как смонтировать каталог хоста в Docker-контейнере

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

Это может решить проблему чрезмерного времени восстановления, например, во время автоматизированных сборок.

Чтобы решить проблему с сетью, вы можете попробовать смонтировать сетевой патч вместо локального пути на этапе разрешения или сначала скопировать файлы из вашей корпоративной сети в локальный кеш.

Весь смысл продажи докеров и контейнерных технологий - изоляция. Таким образом, в док-контейнере ваш пользовательский диск не виден. Если бы это было так, было бы гораздо меньше изоляции. Вам нужно смонтировать локальный каталог 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

Одна более простая альтернатива - кэшировать пакеты 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 запускает перестроение слоя, но это должно происходить реже, чем перестройка контейнера.

Я немного опоздал в игру, но считаю, что нашел простое решение этой проблемы...

  1. Создайте файл NuGet.Config в том же каталоге, что и ваш.sln.
<?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. Запустите docker build с вашим Dockerfile, и все будет решено

Другие вопросы по тегам