如何从Windows 10使用dotnet sdk linux docker映像和已装载卷运行dotnet还原?

时间:2019-02-16 23:00:56

标签: docker build .net-core docker-for-windows dotnet-sdk

我正在使用最新的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>

就是这样。

我正在使用:

  • Windows 10企业版1709
  • Docker桌面社区版本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]

有人知道为什么它不能按我预期的那样工作吗?我是否应该能够像这样在已装载的卷上进行还原?

注意::如果我直接从Windows 10计算机运行相同的dotnet restore命令,一切将按预期运行。


更新

该问题仅在使用“ Windows容器模式(已启用实验性功能)”在Docker中运行Linux容器时出现。让我感到困惑的是,我仍然可以在容器内的已挂载文件夹中创建和写入新文件,追加到现有文件等。怎么可能呢?

1 个答案:

答案 0 :(得分:0)

那是因为不允许运行容器的安全上下文写入您的项目文件夹。不是,而是用来运行docker的用户!

很好的解释:https://jtreminio.com/blog/running-docker-containers-as-current-host-user/(本文末尾有关于Windows的部分)。

您可以尝试以下方法:

在Docker中,单击Docker Settings / Shared Drives底部的“重置凭据”。系统将要求您输入用户名和密码。这将是用来访问您文件的用户!