---
title: "Dockerfileのベストプラクティスとシナリオ"
slug: "dockerfile-best-practices-and-scenarios"
abstract: "Dockerfilesの作成および利用に関するベストプラクティスを説明します。"
---
# Dockerfileのベストプラクティスとシナリオ

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

## ベストプラクティス

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

-   [Dockerファイルを書く際のベストプラクティス](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
-   [Windows Dockerファイルの最適化](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/optimize-windows-dockerfile)

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

-   [マルチステージビルド](https://docs.docker.com/develop/develop-images/multistage-build/)を使ってビルド依存を排除し、最終画像のサイズを小さくしましょう。
-   [ビルド](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context)コンテキスト(および画像サイズ)を減らすために[.dockerignoreファイル](https://docs.docker.com/engine/reference/builder/#dockerignore-file)を追加してください。
-   [画像レイヤー](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/optimize-windows-dockerfile#image-layers-in-docker-build)を理解し、ビルドキャッシュを活用しましょう。
-   [キャッシュを最適化するために、ステップを少ない順に変える順に並べてください。](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/optimize-windows-dockerfile#ordering-instructions)

## 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

...

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

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

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

> !注パッケージ参照に [浮動(\*)またはバージョン範囲](https://docs.microsoft.com/en-us/nuget/concepts/package-versioning) (PackageReference形式のみで利用可能)を使うと、キャッシュされた復元レイヤーに古いパッケージバージョンが表示される可能性があります。正確なバージョンを使う場合は問題ありません。

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

これには[回避策があります](https://stackoverflow.com/questions/51372791/is-there-a-more-elegant-way-to-copy-specific-files-using-docker-copy-to-the-work)。これらの多くはフォルダ構造やプロジェクト名について仮定しています。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 ScenariosにおけるNuGet認証情報の管理](https://github.com/dotnet/dotnet-docker/blob/master/documentation/scenarios/nuget-credentials.md)

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

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

-   [https://hedgehogdevelopment.github.io/tds/chapter5.html#sitecore-tds-builds-using-cloud-servers](https://hedgehogdevelopment.github.io/tds/chapter5.html#sitecore-tds-builds-using-cloud-servers)

この例はHelixで見ることができます[。GitHubのサンプルリポジトリ。](https://github.com/Sitecore/Helix.Examples)