Чтение из частного канала Nuget -. NET Core 3.1 Windows Docker Контейнер - PullRequest
0 голосов
/ 31 марта 2020

Кто-нибудь имеет опыт разработки микросервисов в Azure с. NET Core 3.1 с использованием Windows контейнеров? У меня возникает проблема, когда я пытаюсь сделать мой Dockerfile прочитанным из частного канала Nuget. Вот мой Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ./Nuget.config ./
COPY ["MyService/MyService.csproj", "MyService/"]

ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{\"endpointCredentials\": [{\"endpoint\":\"my_private_feed", \"password\":\"my_personal_access_token\"}]}"

RUN dotnet restore "MyService/MyService.csproj"
COPY . .
WORKDIR "/src/MyService"
RUN dotnet build "MyService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyService.dll"]

Этот dockerfile выдает ошибку 401 Unauthenticated, хотя я знаю, что предоставленные мной учетные данные верны. Я также попытался установить имя пользователя и пароль в моем файле nuget.config, и это, похоже, работает, но я не хочу вносить изменения в код для обновления пароля каждый раз, когда истекает токен. Любой совет, как двигаться дальше отсюда? Я просто не форматирую настройку переменной VSS_NUGET_EXTERNAL_FEED_ENDPOINTS правильно?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

В вашем docker образе, вероятно, не установлен поставщик учетных данных NuGet Azure Artifacts. В этом файле репозитория репо есть ссылка на пример dockerfile , который включает в себя следующую строку:

# download and install latest credential provider. Not required after https://github.com/dotnet/dotnet-docker/issues/878
RUN wget -qO- https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | bash

Поскольку в вашем докер-файле используется базовый образ Windows, а не Linux, вы ' Потребуется адаптировать его, но концептуально это та же проблема, поставщик учетных данных не установлен (или NuGet не знает, как его найти), поэтому NuGet не знает, как аутентифицироваться в вашем фиде.

edit: есть проблема, спрашивающая, как установить на Windows docker образ: https://github.com/microsoft/artifacts-credprovider/issues/169

0 голосов
/ 31 марта 2020

Я сталкивался с той же проблемой в прошлом. Я перестал использовать VSS_NUGET_EXTERNAL_FEED_ENDPOINTS и создал nuget.config на лету

Первый шаг: создание небольшого вспомогательного исполняемого файла

namespace DockerBuild
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Count() != 4)
            {
                Console.WriteLine("Use it: dotnet dockerbuild.dll <username> <pat> <sourceUrl> <target>");
            }
            var user = $"{args[0]}";
            var pat = $"{args[1]}";
            var source = $"{args[2]}";
            var target = $"{args[3]}";

            var xml = $"<?xml version=\"1.0\" encoding=\"utf-8\"?><configuration><packageSources><add key=\"YourFeedName\" value=\"{source}\" /></packageSources><packageSourceCredentials><YourFeedName><add key=\"Username\" value=\"{user}\" /><add key=\"ClearTextPassword\" value=\"{pat}\"/></YourFeedName></packageSourceCredentials></configuration>";
            using (var file = new StreamWriter(target))
            {
                file.WriteLine(xml);
            }
        }
    }
}

Вывод этой консольной программы будет: DockerBuild.exe

Второй шаг: Запустите исполняемый файл на docker build

ENV devops_user=$user
ENV devops_pat=$pat
ENV devops_nuget_source=$nuget_source
RUN DockerBuild.exe %devops_user% %devops_pat% %devops_nuget_source% nuget.config

Теперь у вас есть nuget.config файл в структуре вашей папки, и вам нужно только использовать (или скопировать) его и запустить Ваша dotnet build/publish команда (ы)

Внимание:
Этот пример был выполнен на машине windows с запущенной docker для windows. В linux необходимо изменить вызов DockerBuild.exe, чтобы использовать переменные среды без % и использовать linux эквивалент.

...