DevEx Containers Documentation

DevEx Containers Documentation

  • Docs
  • Help

›参考情報

はじめに

  • 概要
  • 環境を整える
  • 最初のSitecoreインスタンスの実行

Sitecore イメージの作成

  • ソリューションのビルド
  • カスタムSitecoreイメージを構築する
  • コンフィグ変換の適用
  • Sitecoreモジュールの追加
  • カスタム xConnect モデルを含む
  • アイテム展開

ローカル開発とデバッグ

  • 実行中のコンテナへのファイル展開
  • 実行中のコンテナとのアイテム同期
  • コンテナで実行しているコードをデバッグする

参考情報

  • Dockerfileのベストプラクティスとシナリオ
  • Sitecore Dockerチートシート
  • Sitecore モジュールリファレンス
  • Sitecore イメージリファレンス
  • トラブルシューティング

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

このページでは、独自のDockerfilesを書くためのベストプラクティスをリストアップし、DockerベースのSitecore開発中に遭遇する一般的なビルドシナリオをまとめています。

注意: このページの原文は https://containers.doc.sitecore.com/docs/dockerfile-best-practices です

ベストプラクティス

Dockerfileを書くときには、Dockerビルドプロセスへの影響と結果としてのイメージの両方を考慮する必要があります。構造の悪いDockerfileは、ビルド時間が長くなったり、イメージサイズが大きくなったりする原因になります。幸いにも、最適化する方法はたくさんあります。

最良のガイドはDockerとMicrosoftから直接提供されています。どちらも徹底的に読む価値があります。

  • Dockerfileを書くためのベストプラクティス
  • Windows Dockerfile を最適化する

キーポイント

  • マルチステージビルドを使用して、ビルドの依存性を取り除き、最終的なイメージのサイズを小さくします。
  • .dockerignore ファイルをインクルードして、ビルドのコンテキスト (とイメージのサイズ) を小さくします。
  • イメージレイヤーを理解し、ビルドキャッシュを活用する。
  • キャッシングを最適化するために、変更頻度の低いものから最も変更頻度の命令の順序指定を順序立てます。

NuGet リストアの最適化

NuGetリストアを実行することは、Dockerfileでソリューションを構築する際の一般的なステップです。しかし、これは最適化を考えていないとビルド時間を食いつぶしてしまう可能性があります。

覚えておいてほしいのは、各ビルドステップでは、以前のすべてのステップがキャッシュされていれば結果がキャッシュされ、COPYコマンドでは、ソースファイルのハッシュが変更されていなければ結果がキャッシュされるということです。このことを念頭に置いて、キャッシュバストを最小限に抑えるために、NuGetリストアのためにコピーされるファイルをもう少し選択することができます。

簡単な例を示します。

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

# NuGet のエッセンスをコピーし、別のレイヤーとして復元する
COPY *.sln nuget.config .
COPY src\*.csproj .\src\
RUN nuget restore

# 他のすべてをコピーして、ビルドなど
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コンテキストでビルドする際には、資格情報が保護されていることを確認するために、資格情報の管理に特別な配慮が必要です。

詳細は以下の記事を参照してください。

  • DockerシナリオでのNuGet資格情報の管理

Team Development for Sitecore で構築

Team Development for Sitecore (TDS)を使用したDockerソリューションのビルドには、HedgehogDevelopment.TDS NuGetパッケージとTDSライセンス環境変数が必要です。

  • https://hedgehogdevelopment.github.io/tds/chapter5.html#sitecore-tds-builds-using-cloud-servers

GitHubのHelix.Examplesリポジトリで例を見ることができます。

← コンテナで実行しているコードをデバッグするSitecore Dockerチートシート →
  • ベストプラクティス
  • NuGet リストアの最適化
  • プライベートNuGetフィードを使う
  • Team Development for Sitecore で構築
ドキュメント
はじめにカスタムの Sitecore イメージの作成ローカルの開発とデバッグベストプラクティス
リンク
Docker サンプルリポジトリ
Copyright © 2020 Sitecore Japan