4
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-25

.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が下記のように自動的に作成されました

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からの実行ボタンより立ち上がりできます
image.png
ビルド出力
image.png

立ち上がり
image.png

方法2:コマンドでDockerイメージ構築

パッケージマネージャーコンソルにて、docker buildコマンドを実行します

docker build [オプション] PATH | URL | -

Docker
docker build -t test01 -f ./WebApp01/Dockerfile .

image.png

dotnet restoreコマンドエラー

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

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コンテナはインターネットにアクセスできませんが原因ということがわかりました。

参考ページ
ホストに複数のネットワークアダプター(イーサネット、Wi-Fiなど)が存在する場合によく発生します。リモートワークのため、PCがVPN接続してたりしてました。そのVPN接続する時、自動的に他のネットワークアダプターのInterfaceMetricを変えたりしてます。その原因で、自分のWi-Fiネットワークアダプターの優先度が低い、Windowsコンテナにインターネットの接続ができなかった。

解決方法:ネットワークアダプターの優先度修正

Windowsネットワークスタックがゲートウェイルートを正しく選択するには、これらのアダプタの優先度を適切に構成する必要があります。これを修正するには、インターネットに接続されたプライマリネットワークアダプタのInterfaceMetric値を最小に設定します。Powershellコマンドに

Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending
を実行し、アダプタの優先度を確認します。

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 [優先度設定値]

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値が最小になるように設定します。

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1