Как использовать локально созданный NuGet в образе docker?

#c# #docker #asp.net-core #nuget #nuget-package-restore

#c# #docker #asp.net-core #nuget #nuget-пакет-восстановление

Вопрос:

У меня есть вариант использования, когда у меня есть файл .nupkg, уже созданный локально на моем компьютере. Я хочу использовать этот локальный файл nuget в образе docker. Ниже показано, как выглядит существующий файл docker —

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

RUN mkdir -p /nuget
ADD nuget /nuget/

COPY src/*.csproj .
RUN dotnet restore

COPY src/ .
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "EdgeService.dll"]
  

Итак, на RUN dotnet restore шаге он извлекает конкретный пакет nuget из nuget.org репозиторий и создает образ. Мне нужен механизм, с помощью которого он мог бы использовать файл .nupkg, который у меня есть на моем локальном компьютере, вместо того, чтобы извлекать его с сервера nuget.

Могу ли я внести какие-либо изменения в файл .csproj или файл docker, чтобы убедиться, что это произойдет? Необходимо ли в этом случае настраивать локальный сервер nuget?

Ответ №1:

Да, вам нужен где-то работающий сервер nuget. Локальный — это здорово, пока вы не захотите настроить CI, а затем вам понадобится размещенный. Я использовал размещенный контейнер docker с сервером nuget в нем, прежде чем позже перейти на пакеты GitHub.

Однако через некоторое время после запуска этой настройки я обнаружил, что перестраивать пакеты для каждого изменения затруднительно, поэтому я перестроил свое решение, чтобы вообще не нуждаться в частных пакетах NuGet.

Комментарии:

1. Но какие изменения мне нужно внести в dockerfile или где-либо еще, чтобы заставить его использовать локальный сервер nuget вместо nuget.org для извлечения nugget?… почему он не может использовать определенный Nuget (файл .nupkg), который копируется в тот же каталог или куда-либо локально?

2. Вы можете использовать файл NuGet.config и скопировать его из файла docker. Этот NuGet.config направит сборку на ваш локальный сервер.

3. @KumarPallav — Укажите RestoreSources в своем .csproj . Пример: <RestoreSources>$(RestoreSources);absolute-path-to-my-solution-in-the-docker-image/;https://api.nuget.org/v3/index.json</RestoreSources> Перед этим вам нужно будет скопировать пакет в образ Docker dotnet restore , поскольку местоположение должно быть доступно во время работы внутри контейнера. Более простое решение — просто разместить ваш пакет unlisted в nuget.org .

4. @JohnHanley — Настройка RestoreSources, которую вы предлагаете, избавит меня от создания локального частного сервера nuget. Я попробую это и дам вам знать. Спасибо 🙂

5. @KumarPallav Опубликуйте ответ с внесенными вами изменениями. Это поможет другим.

Ответ №2:

Ниже приведены изменения, которые я сделал, чтобы заставить его работать —

Изменения в файле Dockerfile —

 RUN mkdir -p /nuget
ADD Nuget /tmp/Nuget

COPY src/*.csproj .
RUN dotnet restore
  

Изменения в файле .csproj —

 <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json;/tmp/Nuget</RestoreSources>
  

И в папку Nuget я скопировал файл .nupkg, на который я хотел ссылаться в образе docker.

Комментарии:

1. в моем случае с dockerfile это не работает