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

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

このトピックでは、Dockerファイルを書く際のベストプラクティスを説明し、DockerをSitecore開発に使う際の一般的なビルドシナリオをいくつか紹介します。

ベストプラクティス

Dockerfileを書く際には、Dockerのビルドプロセスへの影響とその結果のイメージの両方を考慮してください。構造が悪いDockerfileは、ビルド時間が長くなったり、画像サイズが大きくなったりすることがあります。Dockerファイルを最適化する方法はいくつかあります。最も優れたガイドはDockerとMicrosoftのものです。これらはどちらも学ぶ価値があります:

主なポイントとベストプラクティスは以下の通りです:

NuGet復元最適化

Dockerfileでソリューションを構築する際にNuGetの復元を行うことがよくありますが、プロセスを最適化しないとビルド時間を消費する可能性があります。

各ビルドステップは、すべての前ステップがキャッシュされている場合、またソースファイルのハッシュが変わっていなければCOPYコマンドで結果をキャッシュします。したがって、NuGetリストアのためにコピーするファイルを選ぶことでキャッシュの破損を最小限に抑えることができます。

以下は簡単な例です:

FROM mcr.microsoft.com/dotnet/framework/sdk

.8 AS build

Copy NuGet essentials and restore as distinct layers

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

COPY *.sln nuget.config . COPY src\*.csproj .\src\ RUN nuget restore

Copy everything else, build, etc

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

COPY src\. .\src\ RUN msbuild /p

=Release

...

例は次のように進みます:

  1. 重要なNuGetファイルがコピーされます。
  2. nuget restore はランニングであり、これが他のすべてを引き込みます。

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

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

これは単純なフォルダ構造の基本的な解決策では有用ですが、COPYコマンドのワイルドカード制限 によりフォルダ構造が失われるため、多くの解決策(例えばSitecore Helix)では実現できません。

これには回避策があります。これらの多くはフォルダ構造やプロジェクト名について仮定しています。Sitecore例で一般的に使われる方法は、robocopyに加えて別の準備ビルド段階があります(これによりこれらの前提は除外されます):

FROM mcr.microsoft.com/dotnet/framework/sdk

.8 AS prep

Gather only artifacts necessary for NuGet restore, retaining directory structure

Version:
日本語翻訳に関する免責事項

このページの翻訳は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

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

FROM mcr.microsoft.com/dotnet/framework/sdk

.8 AS build

Copy prepped NuGet artifacts, and restore as distinct layer

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

COPY --from=prep .\nuget .\ RUN nuget restore

Copy everything else, build, etc

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

COPY src\ .\src\ RUN msbuild /p

=Release

...

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

ビルドではプライベートフィードからNuGetパッケージを取得する必要があるかもしれません。Dockerコンテキストで構築する際は、認証情報の管理に特別な配慮をしなければなりません。詳細は以下の記事を参照してください。

Sitecoreのチーム開発と共に構築する

Team Development for Sitecore(TDS)で構築されるDockerソリューションは、HedgehogDevelopment.TDS NuGetパッケージとTDSライセンス環境変数を必要とします。以下に説明されています。

この例はHelixで見ることができます。GitHubのサンプルリポジトリ。

この記事を改善するための提案がある場合は、 お知らせください!