Как запустить восстановление 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
в докере. Вас спросят о вашем пользователе и пароле. Это будет пользователь, используемый для доступа к вашим файлам!