#.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が下記のように自動的に作成されました
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"]
##方法1:Visual Studio Docker実行
Visual Studioからの実行ボタンより立ち上がりできます
ビルド出力
##方法2:コマンドでDockerイメージ構築
パッケージマネージャーコンソルにて、docker buildコマンドを実行します
docker build [オプション] PATH | URL | -
docker build -t test01 -f ./WebApp01/Dockerfile .
###dotnet restoreコマンドエラー
省略
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"」を実行するとき、エラー発生しました。
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コンテナはインターネットにアクセスできませんが原因ということがわかりました。
参考ページ
ホストに複数のネットワークアダプター(イーサネット、Wi-Fiなど)が存在する場合によく発生します。リモートワークのため、PCがVPN接続してたりしてました。そのVPN接続する時、自動的に他のネットワークアダプターのInterfaceMetricを変えたりしてます。その原因で、自分のWi-Fiネットワークアダプターの優先度が低い、Windowsコンテナにインターネットの接続ができなかった。
###解決方法:ネットワークアダプターの優先度修正
Windowsネットワークスタックがゲートウェイルートを正しく選択するには、これらのアダプタの優先度を適切に構成する必要があります。これを修正するには、インターネットに接続されたプライマリネットワークアダプタのInterfaceMetric値を最小に設定します。Powershellコマンドに
Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending
を実行し、アダプタの優先度を確認します。
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 [優先度設定値]
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値が最小になるように設定します。
これで解決ました。メモしますー