Dockerfile のベスト プラクティスとシナリオ

Current version: 10.2

このトピックでは、Dockerfile を作成するためのベスト プラクティスについて説明し、Sitecore での開発に Docker を使用する場合のいくつかの一般的なビルドのシナリオを示します。

ベスト プラクティス

Dockerfile を作成するときは、Docker のビルド プロセスへの影響と作成されるイメージの両方を考慮します。構造が適切でない Dockerfile では、ビルドの時間が長くなったり、イメージのサイズが大きくなったりします。Dockerfile を最適化する方法はいくつかあります。最適なガイドは、以下の Docker と Microsoft のものです。これらはどちらも役立ちます。

重要な点とベスト プラクティスは次のとおりです。

NuGet の復元の最適化

Dockerfile でソリューションを作成する場合は NuGet の復元を行うことがよくありますが、プロセスを最適化しないとビルドの時間が無駄になることがあります。

各ビルド ステップは、前のすべてのステップが COPY コマンドを使用してキャッシュされており、ソース ファイルのハッシュが変更されていない場合に結果をキャッシュします。そのため、NuGet の復元でコピーするファイルを選択することで、キャッシュ バスティングを最小限に抑えることができます。

以下に簡単な例を示します。

RequestResponse
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build

# Copy NuGet essentials and restore as distinct layers
COPY *.sln nuget.config .
COPY src\*.csproj .\src\
RUN nuget restore

# Copy everything else, build, etc
COPY src\. .\src\
RUN msbuild /p:Configuration=Release

[...]

この例は次のように動作します。

  1. 必須の NuGet ファイルがコピーされます。

  2. nuget restore が実行され、その他のファイルが読み込まれます。

これにより、NuGet の復元ステップがより頻繁にキャッシュされるため、それらを毎回ダウンロードする必要がなくなります。

注記

パッケージの参照に浮動 (*) またはバージョン範囲を使用する場合 (PackageReference 形式でのみ使用可能) は、それによってキャッシュされた復元レイヤーに古いパッケージのバージョンが含まれる可能性があります。正確なバージョンを使用する場合は、これは問題になりません。

これはシンプルなフォルダー構造の基本的なソリューションでは役立ちますが、COPY コマンドのワイルドカードの制限によってフォルダー構造が失われるため、ほとんどのソリューション (Sitecore Helix など) では行えません。

これには回避策があります。そのほとんどは、フォルダー構造とプロジェクトの名前付けを想定することです。Sitecore のサンプルでよく使用されている方法には、別の準備のビルドの段階と robocopy を使用するものがあります (これにより、想定の必要がなくなります)。

RequestResponse
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS prep

# Gather only artifacts necessary for NuGet restore, retaining directory structure
COPY *.sln nuget.config \nuget\
COPY src\ \temp\
RUN Invoke-Expression 'robocopy C:\temp C:\nuget\src /s /ndl /njh /njs *.csproj *.scproj packages.config'

[...]

# New build stage, independent cache
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build

# Copy prepped NuGet artifacts, and restore as distinct layer
COPY --from=prep .\nuget .\
RUN nuget restore

# Copy everything else, build, etc
COPY src\ .\src\
RUN msbuild /p:Configuration=Release

[...]

NuGet のプライベート フィードの使用

ビルドでは、プライベート フィードから NuGet パッケージを取得する必要がある場合があります。Docker のコンテキストでビルドする場合は、資格情報が確実に保護されるように、資格情報の管理に特別な注意を払う必要があります。詳細については、次の記事を参照してください。

Team Development for Sitecore を使用した作成

Team Development for Sitecore (TDS) を使用した Docker ソリューションの作成には、以下のページで説明するように HedgehogDevelopment.TDS NuGet パッケージと TDS ライセンス環境変数が必要です。

このサンプルについては、GitHub の Helix.Examples リポジトリを参照してください。

Do you have some feedback for us?

If you have suggestions for improving this article,