我正在使用最新的microsoft / dotnet sdk图像(microsoft/dotnet:2.2.104-sdk-alpine3.8
)建立一个非常简单的.NET Standard项目构建。
这是为了将现有代码和现有构建基础架构迁移到新的存储库和构建基础架构(GitLab(这里不是很重要))。
新的构建基础架构当然正在利用Docker。但我还需要能够使用Docker在我的本地Windows 10上构建(需要这个来证明SW也可以在没有GitLab的情况下构建,而不依赖于某个构建计算机)。
我试过的是简单地将我的项目文件夹挂载到docker镜像,然后运行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>
而已。
我正在使用:
预期的结果是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]
有没有人知道为什么这不能像我期望的那样工作?我不应该能够像我这样在我的挂载卷上进行恢复吗?
注意:如果我直接从Windows 10计算机运行相同的dotnet restore命令,一切都按预期工作。
UPDATE
只有在使用“Windows容器模式(已启用实验功能)”在Docker中运行Linux容器时才会出现此问题。令我困惑的是,我仍然可以在容器内创建和写入新文件,附加到已安装文件夹中的现有文件等。怎么可能?
这只是因为不允许运行容器的安全上下文写入项目文件夹。那不是你,它是用户运行docker的!
很好的解释:https://jtreminio.com/blog/running-docker-containers-as-current-host-user/(文章末尾有关于Windows的部分)。
你可以试试这个:
点击Docker中Docker Settings
/ Shared Drives
底部的“重置凭据”。系统将要求您提供用户名和密码。这将是用户访问您的文件!