Dockerfile のベスト プラクティスとシナリオ
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
このトピックでは、Dockerfile を作成するためのベスト プラクティスについて説明し、Sitecore での開発に Docker を使用する場合のいくつかの一般的なビルドのシナリオを示します。
ベスト プラクティス
Dockerfile を作成するときは、Docker のビルド プロセスへの影響と作成されるイメージの両方を考慮します。構造が適切でない Dockerfile では、ビルドの時間が長くなったり、イメージのサイズが大きくなったりします。Dockerfile を最適化する方法はいくつかあります。最適なガイドは、以下の Docker と Microsoft のものです。これらはどちらも役立ちます。
重要な点とベスト プラクティスは次のとおりです。
-
マルチステージ ビルドを使用して、ビルドの依存関係を削除し、最終的なイメージのサイズを削減します。
-
.dockerignore ファイルをインクルードして、ビルドのコンテキスト (およびイメージのサイズ) を削減します。
-
イメージのレイヤーを理解して、ビルド キャッシュを活用します。
-
ビルド ステップの順序を、変更が最も少ないものから最も多いものへの順にして、キャッシュを最適化します。
NuGet の復元の最適化
Dockerfile でソリューションを作成する場合は NuGet の復元を行うことがよくありますが、プロセスを最適化しないとビルドの時間が無駄になることがあります。
各ビルド ステップは、前のすべてのステップが COPY
コマンドを使用してキャッシュされており、ソース ファイルのハッシュが変更されていない場合に結果をキャッシュします。そのため、NuGet の復元でコピーするファイルを選択することで、キャッシュ バスティングを最小限に抑えることができます。
以下に簡単な例を示します。
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
[...]
この例は次のように動作します。
-
必須の NuGet ファイルがコピーされます。
-
nuget restore
が実行され、その他のファイルが読み込まれます。
これにより、NuGet の復元ステップがより頻繁にキャッシュされるため、それらを毎回ダウンロードする必要がなくなります。
パッケージの参照に浮動 (*) またはバージョン範囲を使用する場合 (PackageReference 形式でのみ使用可能) は、それによってキャッシュされた復元レイヤーに古いパッケージのバージョンが含まれる可能性があります。正確なバージョンを使用する場合は、これは問題になりません。
これはシンプルなフォルダー構造の基本的なソリューションでは役立ちますが、COPY コマンドのワイルドカードの制限によってフォルダー構造が失われるため、ほとんどのソリューション (Sitecore Helix など) では行えません。
これには回避策があります。そのほとんどは、フォルダー構造とプロジェクトの名前付けを想定することです。Sitecore のサンプルでよく使用されている方法には、別の準備のビルドの段階と robocopy
を使用するものがあります (これにより、想定の必要がなくなります)。
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 リポジトリを参照してください。