1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ASP.NET CoreでホットリロードするDocker開発環境を構築する方法

Last updated at Posted at 2025-01-01

DockerでASP.NET Core (.NET 8) の開発環境を構築する機会がありました.そこで備忘として,実際に行った環境構築の方法をまとめます.

本記事は開発環境構築についてのご紹介ですが,本番環境構築時に行ったことについても後日まとめようと思います.

環境

  • MacBook Air M2 (macOS Sequoia)
  • .NET 8
  • ASP.NET Core Blazor

環境にmacOSと記載していますが,Windows環境でも動作することを確認しております.

ディレクトリ構成

ASP.NET Coreプロジェクトのディレクトリ構成は以下のとおりです.一部不要なディレクトリ名やファイル名は記載していません.

src/
├ bin/
├ obj/
├ Components/
├ Properties/
│ └ launchSettings.json
├ appsettings.json
├ hogehoge.csproj
└ Program.cs
hogehoge.sln

1. Dockerfileの作成

非Docker環境でホットリロードありのデバッグを行う場合,CLI環境ならcsprojファイルのある階層でdotnet watch runすると思います.
これと同様のことをDockerでも行えば良いので,以下のようにDockerfileを構成します.
尚,Dockerfileはslnファイルと同階層に配置します.

Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base

ENV ASPNETCORE_ENVIRONMENT=Development

WORKDIR /app
COPY . ./

WORKDIR /app/src
RUN dotnet restore

ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore" ]

ポイント

  • FROM句でベースとなる.NET SDKのコンテナレイヤをビルドします.
  • COPY . ./でプロジェクトのディレクトリ全体をDockerコンテナの/appディレクトリにコピーします.
  • コンテナの/app/srcディレクトリにてdotnet restoreにより依存関係を復元したのち,dotnet watch run --no-restoreでホットリロードありのデバッグを開始します.

2. docker-compose.ymlの作成

Dockerfileと同階層に,docker-compose.ymlファイルを作成します.
内容は以下のとおりです.

docker-compose.yml
services:
    aspnetcore:
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - 8080:5000
        volumes:
            - ./src/.:/app/src

ポイント

  • build: dockerfile:には,docker-compose.ymlから見たDockerfileの相対パスを記載します.
  • ports:にはWebアプリケーションのポートを記載します.[ホスト側のポート]:[コンテナ側のポート]の形式で記載します.
    尚,[コンテナ側のポート]は後述するappsettings.jsonにて設定可能です.
  • volumes:にてホスト側のsrcディレクトリと,コンテナ側の/app/srcディレクトリをバインドしています.書式は[ホスト側のパス]:[コンテナ側のパス]です.
    これによりホスト側のファイルを変更した際は,その内容が即座にコンテナ側のディレクトリに反映され,その後ホットリロードが実行されます.

3. appsettings.jsonの設定

appsettings.jsonに以下の設定を追加します.

appsettings.json
"Kestrel": {
    "Endpoints": {
        "Http": {
            "Url": "http://*:5000"
        }
    }
}

ASP.NET CoreではKestrelというサーバーを利用します.そのエンドポイントとして,上記のように任意のURLを指定することができます.

ポイント

  • Dockerで構築する場合,URLのホスト名は自身を表すlocalhost127.0.0.1ではなく,すべてのアドレスを示す0.0.0.0*を記載します.その上で任意のポートを:で繋げてURLを構成します.
    指定するポートはコンテナ側が待ち受けるポートになります.上記の例では,docker-compose.ymlで指定した5000番を指定しています.

4. いざコンテナ実行

docker-compose.ymlがあるディレクトリにて,以下コマンドを実行します.

docker compose up -d

少々時間がかかりますが,http://localhost:[docker-compose.ymlで指定したホスト側ポート]にアクセスしてWebアプリケーションの画面が表示されれば構築成功です(本記事の例ではhttp://localhost:8080にアクセスします).

コンテナやプロジェクトのビルドのログについては,Docker DesktopのコンテナのLogsにて確認することができます.

以上,DockerでのASP.NET Core開発環境構築の方法でした.

補足:ホットリロードが効かなくなる問題の対処法

ホットリロードできないような編集(Rude編集と呼ぶようです)を行った場合,dotnet watchは以下を表示し,コマンドの入力を求めてきます.

Unable to apply hot reload because of a rude edit.
Do you want to restart your app - Yes (y) / No (n) / Always (a) / Never (v)?

ただし,Docker環境ではこの入力ができないので,Rude編集があったとしても入力を求めないような設定が必要です.

その設定は,コンテナに環境変数DOTNET_WATCH_RESTART_ON_RUDE_EDITを新たに定義し,その値にtrueを指定することで実現します.

環境変数はDockerfileに記載する,または別途.envファイルに記載してそれをdocker-compose.ymlで指定する,等の方法で定義します.

ここでは上記の2通りの方法をご紹介します.開発するプロジェクトに適した方法を採用いただければと思います.

Dockerfileに記載する方法

ENV命令を使用します.

Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base

+ ENV DOTNET_WATCH_RESTART_ON_RUDE_EDIT=true
ENV ASPNETCORE_ENVIRONMENT=Development

WORKDIR /app
COPY . ./

WORKDIR /app/src
RUN dotnet restore

ENTRYPOINT [ "dotnet", "watch", "run", "--no-restore" ]

.envファイルに記載する方法

.env
DOTNET_WATCH_RESTART_ON_RUDE_EDIT=true

このように記載した.envファイルを作成し,docker-compose.ymlで以下のとおり指定します.

docker-compose.yml
services:
    aspnetcore:
        build:
            context: .
            dockerfile: Dockerfile
        ports:
            - 8080:5000
        volumes:
            - ./src/.:/app/src
+       env_file:
+           - <docker-compose.ymlから見た.envファイルの相対パス>           
1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?