Как запустить восстановление dotnet, используя образ докера dotnet sdk linux и смонтированный том из Windows 10? - PullRequest
0 голосов
/ 17 февраля 2019

Я настраиваю очень простую сборку проекта .NET Standard с использованием новейшего образа microsoft / dotnet sdk (microsoft/dotnet:2.2.104-sdk-alpine3.8).

Это для миграции существующего кода и существующей инфраструктуры сборки вновый репозиторий и инфраструктура сборки (GitLab (не очень важно здесь)).

Новая инфраструктура сборки, конечно, использует Docker.Но мне также нужно иметь возможность собираться на моем локальном Windows 10 с помощью Docker (это нужно, чтобы доказать, что ПО можно собирать и без GitLab, не будучи зависимым от определенного компьютера сборки).

Что у меня естьПопытка состоит в том, чтобы просто смонтировать папку моего проекта в образ докера и затем запустить dotnet restore.Я делаю это в интерактивном режиме, чтобы понять, что происходит:

docker run -it --rm --volume c:\projects\test-project`:/project microsoft/dotnet:2.2.104-sdk-alpine3.8

А затем внутри контейнера:

cd project
dotnet restore TestProject.sln

Мое решение очень простое.Выглядит так:

test-project/
  src/
    ClassLibrary1/
      ClassLibrary1.csproj
  TestProject.sln

, где ClassLibrary1.csproj выглядит так (просто ссылается на json.net):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
  </ItemGroup>

</Project>

Вот и все.

Я использую:

  • Windows 10 Enterprise Version 1709
  • Docker Desktop Community Версия 2.0.0.3 (31259)

Ожидаемый результат заключается в том, что восстановление dotnet должно работатьбез проблем.

Фактический результат меня удивляет:

/project # dotnet restore TestProject.sln
  Restoring packages for /project/src/ClassLibrary1/ClassLibrary1.csproj...
  Installing Newtonsoft.Json 12.0.1.
  Generating MSBuild file /project/src/ClassLibrary1/obj/ClassLibrary1.csproj.nuget.g.props.
/usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): error : Access to the path '/project/src/ClassLibrary1/obj/8a35f086-c8be-4d31-93df-14c254b9be6c.tmp' is denied. [/project/TestProject.sln]
/usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): error :   Permission denied [/project/TestProject.sln]

У кого-нибудь есть идеи, почему это не работает, как я ожидаю?Я не должен быть в состоянии сделать восстановление на моем подключенном томе, как это?

Примечание: Если я запускаю ту же самую команду восстановления dotnet непосредственно с моего компьютера с Windows 10, все работает должным образом.


ОБНОВЛЕНИЕ

Эта проблема возникает только при запуске контейнера Linux в Docker с использованием «Режим контейнера Windows (включены экспериментальные функции)».Меня сбивает с толку то, что я все еще могу создавать и записывать новые файлы, добавлять к существующим файлам и т. Д. В подключенной папке из контейнера.Как это может быть?

1 Ответ

0 голосов
/ 17 февраля 2019

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

Отличное объяснение: https://jtreminio.com/blog/running-docker-containers-as-current-host-user/ (в конце статьи есть раздел о Windows).

Вы можете попробовать это:

Нажмите «Сбросить учетные данные» в нижней части Docker Settings / Shared Drives в Docker.Вас спросят о вашем пользователе и пароле.Это будет пользователь для доступа к вашим файлам!

...