最新の microsoft/dotnet SDK イメージ ( microsoft/dotnet:2.2.104-sdk-alpine3.8
) を使用して、.NET Standard プロジェクトの非常に単純なビルドをセットアップしています。
これは、既存のコードと既存のビルド インフラストラクチャを新しいリポジトリとビルド インフラストラクチャ (GitLab (ここではあまり重要ではありません)) に移行するためのものです。
もちろん、新しいビルド インフラストラクチャは Docker を活用しています。ただし、Docker を使用してローカルの Windows 10 でビルドできる必要もあります (特定のビルド コンピューターに依存せずに、GitLab を使用しなくても SW をビルドできることを証明するためにこれが必要です)。
私が試したのは、プロジェクト フォルダーを 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]
これが期待どおりに機能しない理由を知っている人はいますか? このように、マウントされたボリュームを復元することはできないのでしょうか?
注:同じ dotnet restore コマンドを Windows 10 コンピューターから直接実行すると、すべてが期待どおりに機能します。
アップデート
この問題は、「Windows コンテナー モード (実験的機能が有効)」を使用して Docker で Linux コンテナーを実行している場合にのみ発生します。私を混乱させているのは、コンテナ内からマウントされたフォルダで、新しいファイルを作成して書き込んだり、既存のファイルに追加したりできることです。それはどうしてですか?