#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>
Перед этим вам нужно будет скопировать пакет в образ Dockerdotnet 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 это не работает