• システム開発に関わる内容をざっくりと書いていく

.net coreアプリケーションのDockerイメージのマルチステージビルド

# アプリが実行されるコンテナイメージを指定
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
# コンテナ内の作業ディレクトリを指定
WORKDIR /app
# ポート80と443を公開
EXPOSE 80
EXPOSE 443

# ビルド用のコンテナイメージを指定
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# NuGet.configをコピー
COPY ["NuGet.config", "."]
# プロジェクトファイルをコピー
COPY ["src/Services/ms-cart/Cart.Api/Cart.Api.csproj", "src/Services/ms-cart/Cart.Api/"]
# プロジェクトの復元
RUN dotnet restore "src/Services/ms-cart/Cart.Api/Cart.Api.csproj"
# ソースコードをコピー(ローカルの全てのファイルを /src ディレクトリにコピー)
COPY . .
# プロジェクトフォルダへ移動
WORKDIR "/src/src/Services/ms-cart/Cart.Api"
# ビルド (Releaseモードでビルドし、/app/build ディレクトリに出力)
RUN dotnet build "Cart.Api.csproj" -c Release -o /app/build

# パブリッシュ用のコンテナイメージを指定 (ビルド用のコンテナイメージから引き継ぐ)
FROM build AS publish
# ビルドされたアプリケーションを /app/publish ディレクトリに出力 (UseAppHost=false は、ASP.NET Core 6.0 の新機能で、アプリケーションホストを使用しないようにするためのオプション)
RUN dotnet publish "Cart.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false

# 実行用のコンテナイメージを指定 (ベースイメージから引き継ぐ)
FROM base AS final
# コンテナ内の作業ディレクトリを指定
WORKDIR /app
# ビルドされたアプリケーションを /app/publish ディレクトリにコピー (publish ステージからコピー) publish ステージで出力されたファイル(/app/publish直下)を /app ディレクトリにコピー
COPY --from=publish /app/publish .
# アプリケーションの実行 コンテナが起動した際に実行されるコマンドを指定。この場合、.NET ランタイムを使って、Cart.Api.dll(アプリケーション)を実行。
ENTRYPOINT ["dotnet", "Cart.Api.dll"]

マルチステージビルドで下記に分けれれる

1. 基本環境の準備 (base ステージ)

2. ビルドステージ (build ステージ)

3. パブリッシュステージ (publish ステージ)

4. 実行ステージ (final ステージ)

分けられてはいるが、使用するイメージは実行用とビルド用になる

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
.NET 6.0 ASP.NET Core ランタイムのベースイメージを指定。このベースイメージは、アプリケーションの実行に必要な ASP.NET Core ランタイムのみを含んでおり、ビルドツールは含まれていない。

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
.NET SDK(ビルドツールを含む完全な .NET 環境)が使われる。この SDK イメージを使って、アプリケーションのビルドを行う。

端的に言うと、ビルド用のイメージでビルドから発行したものを、実行用のイメージにのせるだけ

最終的に記載されたイメージのみが成果物となる

FROM base AS final