Как запустить восстановление dotnet, используя образ докера dotnet sdk linux и смонтированный том из Windows 10?

Я настраиваю очень простую сборку проекта.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 Корпоративная Версия 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 ответ

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

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

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

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

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