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に加えて別のprep ビルド ステージがあります (これにより、これらの仮定はすべて削除されます)。
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コンテキストでビルドする際には、認証情報が確実に保護されるように、認証情報の管理について特別な考慮を払う必要があります。詳細については、次の記事を参照してください。
Sitecoreのチーム開発による構築
Team Development for Sitecore (TDS) を使用したDockerソリューション ビルドには、ここで説明するように、HedgehogDevelopment.TDS NuGetパッケージとTDSライセンス環境変数が必要です。
この例は、GitHubのHelix.Examplesリポジトリで確認できます。