【问题标题】:How to run dotnet restore using dotnet sdk linux docker image and mounted volume from Windows 10?如何使用 dotnet sdk linux docker 映像和从 Windows 10 安装的卷运行 dotnet restore?
【发布时间】:2019-07-10 17:30:45
【问题描述】:

我正在使用最新的 microsoft/dotnet sdk 映像 (microsoft/dotnet:2.2.104-sdk-alpine3.8) 建立一个非常简单的 .NET Standard 项目。

这是为了将现有代码和现有构建基础架构迁移到新的存储库和构建基础架构(GitLab(这里并不重要))。

新的构建基础架构当然是利用 Docker。但是我还需要能够使用 Docker 在我的本地 Windows 10 上构建(需要这个来证明软件也可以在没有 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 restore 应该可以正常工作。

实际结果让我吃惊:

/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 容器时出现。令我困惑的是,我仍然可以在容器内的已挂载文件夹中创建和写入新文件、附加到现有文件等。怎么可能?

【问题讨论】:

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


    【解决方案1】:

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

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

    你可以试试这个:

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

    【讨论】:

    • 经过进一步调查,解决方案似乎很简单。但我仍然不确定行为是否符合预期。无论如何。我在“Windows 容器模式”下运行 Docker。将其更改为“Linux 容器模式”可以解决问题(如果我尚未输入凭据,Docker 会询问我的凭据)。我仍然感到困惑的是,即使在“Windows 容器模式”下运行 linux 容器时,我 可以 从 docker 容器内写入 /project 文件夹中的文件。我也希望这会失败,但事实并非如此。我会用这些附加信息更新可能的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2022-01-16
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多