Dockerfileのベストプラクティスとシナリオ
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
このトピックでは、Dockerファイルを書く際のベストプラクティスを説明し、DockerをSitecore開発に使う際の一般的なビルドシナリオをいくつか紹介します。
ベストプラクティス
Dockerfileを書く際には、Dockerのビルドプロセスへの影響とその結果のイメージの両方を考慮してください。構造が悪いDockerfileは、ビルド時間が長くなったり、画像サイズが大きくなったりすることがあります。Dockerファイルを最適化する方法はいくつかあります。最も優れたガイドはDockerとMicrosoftのものです。これらはどちらも学ぶ価値があります:
主なポイントとベストプラクティスは以下の通りです:
- マルチステージビルドを使ってビルド依存を排除し、最終画像のサイズを小さくしましょう。
- ビルドコンテキスト(および画像サイズ)を減らすために.dockerignoreファイルを追加してください。
- 画像レイヤーを理解し、ビルドキャッシュを活用しましょう。
- キャッシュを最適化するために、ステップを少ない順に変える順に並べてください。
NuGet復元最適化
Dockerfileでソリューションを構築する際にNuGetの復元を行うことがよくありますが、プロセスを最適化しないとビルド時間を消費する可能性があります。
各ビルドステップは、すべての前ステップがキャッシュされている場合、またソースファイルのハッシュが変わっていなければCOPYコマンドで結果をキャッシュします。したがって、NuGetリストアのためにコピーするファイルを選ぶことでキャッシュの破損を最小限に抑えることができます。
以下は簡単な例です:
FROM mcr.microsoft.com/dotnet/framework/sdk
.8 AS buildCopy NuGet essentials and restore as distinct layers
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
COPY *.sln nuget.config . COPY src\*.csproj .\src\ RUN nuget restore
Copy everything else, build, etc
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
COPY src\. .\src\ RUN msbuild /p
=Release...
例は次のように進みます:
- 重要なNuGetファイルがコピーされます。
- nuget restore はランニングであり、これが他のすべてを引き込みます。
これによりNuGetの復元ステップがより頻繁にキャッシュされるため、毎回ダウンロードする必要がなくなります。
!注パッケージ参照に 浮動(*)またはバージョン範囲 (PackageReference形式のみで利用可能)を使うと、キャッシュされた復元レイヤーに古いパッケージバージョンが表示される可能性があります。正確なバージョンを使う場合は問題ありません。
これは単純なフォルダ構造の基本的な解決策では有用ですが、COPYコマンドのワイルドカード制限 によりフォルダ構造が失われるため、多くの解決策(例えばSitecore Helix)では実現できません。
これには回避策があります。これらの多くはフォルダ構造やプロジェクト名について仮定しています。Sitecore例で一般的に使われる方法は、robocopyに加えて別の準備ビルド段階があります(これによりこれらの前提は除外されます):
FROM mcr.microsoft.com/dotnet/framework/sdk
.8 AS prepGather only artifacts necessary for NuGet restore, retaining directory structure
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
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
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
FROM mcr.microsoft.com/dotnet/framework/sdk
.8 AS buildCopy prepped NuGet artifacts, and restore as distinct layer
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
COPY --from=prep .\nuget .\ RUN nuget restore
Copy everything else, build, etc
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
COPY src\ .\src\ RUN msbuild /p
=Release...
プライベートNuGetフィードの使用
ビルドではプライベートフィードからNuGetパッケージを取得する必要があるかもしれません。Dockerコンテキストで構築する際は、認証情報の管理に特別な配慮をしなければなりません。詳細は以下の記事を参照してください。
Sitecoreのチーム開発と共に構築する
Team Development for Sitecore(TDS)で構築されるDockerソリューションは、HedgehogDevelopment.TDS NuGetパッケージとTDSライセンス環境変数を必要とします。以下に説明されています。
この例はHelixで見ることができます。GitHubのサンプルリポジトリ。