.NETCore Dockerイメージ構築dotnet restore失敗と解決方法

#.NETCore Dockerイメージ構築

Visual Studio のコンテナー ツールを使って、自分のNET Core アプリのコンテナー化をやって見ました。.NET Docker Windowsコンテナ イメージ化時 dotnet restoreファイル失敗と解決方法をメモします。

##Docker サポートの追加
microsoft公式手順
https://docs.microsoft.com/ja-jp/visualstudio/containers/overview?view=vs-2019
を参照して頂ければと思います。

**Dockerfile**が下記のように自動的に作成されました

```java:Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["WebApp01/WebApp01.csproj", "WebApp01/"]
RUN dotnet restore "WebApp01/WebApp01.csproj"
COPY . .
WORKDIR "/src/WebApp01"
RUN dotnet build "WebApp01.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApp01.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApp01.dll"]
```
##方法１：Visual Studio　Docker実行
Visual Studioからの実行ボタンより立ち上がりできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518384/b1f4919c-0bea-950b-43b1-20bc2c75c9b9.png)
ビルド出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518384/25fd88e6-be46-c9b8-45d5-3c751daded1f.png)

立ち上がり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518384/5a683878-020e-bf7f-0f29-5ff7469f29fe.png)

##方法２：コマンドでDockerイメージ構築

パッケージマネージャーコンソルにて、docker buildコマンドを実行します
> docker build [オプション] PATH | URL | -

```java:Docker
docker build -t test01 -f ./WebApp01/Dockerfile .
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518384/8e96c0c2-d2b7-40ef-e5b3-ba75d31fc7e8.png)



###dotnet restoreコマンドエラー
```java:Dockerfile
省略
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["WebApp01/WebApp01.csproj", "WebApp01/"]
RUN dotnet restore "WebApp01/WebApp01.csproj"
省略
```
「dotnet restore "WebApp01/WebApp01.csproj"」を実行するとき、エラー発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518384/d8d78f51-4fcb-be49-71d3-ab39bd52f1ed.png)


```java:Docker
Unable to load the service index for source https://api.nuget.org/v3/index.json. 
No such host is known. [C:\src\WebApp01\WebApp01.csproj]
docker : The command 'cmd /S /C dotnet restore "WebApp01/WebApp01.csproj"' returned a non-zero code: 1
```

###原因：Windowsコンテナはインターネットにアクセスできません
ホストが見つからない。半日かかって色々調べて、やっと**Windowsコンテナはインターネットにアクセスできません**が原因ということがわかりました。

[参考ページ](https://github.com/docker/for-win/issues/2760#issuecomment-430889666)
ホストに<font color='red'>複数のネットワークアダプター</font>（イーサネット、Wi-Fiなど）が存在する場合によく発生します。リモートワークのため、PCがVPN接続してたりしてました。そのVPN接続する時、自動的に他のネットワークアダプターのInterfaceMetricを変えたりしてます。その原因で、自分のWi-Fiネットワークアダプターの優先度が低い、Windowsコンテナにインターネットの接続ができなかった。

###解決方法:ネットワークアダプターの優先度修正
Windowsネットワークスタックがゲートウェイルートを正しく選択するには、これらのアダプタの優先度を適切に構成する必要があります。これを修正するには、インターネットに接続されたプライマリネットワークアダプタのInterfaceMetric値を最小に設定します。Powershellコマンドに
>Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending
を実行し、アダプタの優先度を確認します。

```Java:Powershell
PS C:\WINDOWS\system32> Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
38      vEthernet (Default Switch)      IPv4                  1500            5000 Disabled Connected       ActiveStore
71      vEthernet (WSL)                 IPv4                  1500            5000 Disabled Connected       ActiveStore
75      vEthernet (nat)                 IPv4                  1500            5000 Disabled Connected       ActiveStore
42      携帯電話                        IPv4                  1430              85 Disabled Disconnected    ActiveStore
1       Loopback Pseudo-Interface 1     IPv4            4294967295              75 Disabled Connected       ActiveStore
39      Bluetooth ネットワーク接続      IPv4                  1500              65 Enabled  Disconnected    ActiveStore
31      Wi-Fi                           IPv4                  1500            25 Enabled  Connected       ActiveStore 
32      ローカル エリア接続* 2          IPv4                  1500              25 Disabled Disconnected    ActiveStore
27      ローカル エリア接続* 10         IPv4                  1500              25 Enabled  Disconnected    ActiveStore
24      イーサネット                    IPv4                  1500               5 Enabled  Disconnected    ActiveStore
```
ここで「Wi-Fi」ホストのプライマリインターネット接続ネットワークアダプターのInterfaceMetric値が「25」になってます、最小にする必要があります。
下記コマンドを使用し、ネットワーク インターフェイスの順序を構成変更を加えます。
>Set-NetIPInterface -InterfaceAlias 「InterfaceAlias名」 -InterfaceMetric [優先度設定値]

```Java:Powershell

PS C:\WINDOWS\system32> Set-NetIPInterface -InterfaceAlias 'Wi-Fi' -InterfaceMetric 3
PS C:\WINDOWS\system32> Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending

ifIndex InterfaceAlias                  AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp     ConnectionState PolicyStore
------- --------------                  ------------- ------------ --------------- ----     --------------- -----------
38      vEthernet (Default Switch)      IPv4                  1500            5000 Disabled Connected       ActiveStore
71      vEthernet (WSL)                 IPv4                  1500            5000 Disabled Connected       ActiveStore
75      vEthernet (nat)                 IPv4                  1500            5000 Disabled Connected       ActiveStore
42      携帯電話                        IPv4                  1430              85 Disabled Disconnected    ActiveStore
1       Loopback Pseudo-Interface 1     IPv4            4294967295              75 Disabled Connected       ActiveStore
39      Bluetooth ネットワーク接続      IPv4                  1500              65 Enabled  Disconnected    ActiveStore
32      ローカル エリア接続* 2          IPv4                  1500              25 Disabled Disconnected    ActiveStore
27      ローカル エリア接続* 10         IPv4                  1500              25 Enabled  Disconnected    ActiveStore
24      イーサネット                    IPv4                  1500               5 Enabled  Disconnected    ActiveStore
31      Wi-Fi                           IPv4                  1500               3 Enabled  Connected       ActiveStore
```
Hyper-Vで外部仮想スイッチをセットアップしているためにホストのプライマリネットワークアダプターがブリッジされている場合は、外部仮想スイッチのInterfaceMetric値が最小になるように設定します。

これで解決ました。メモしますー