クラウドビルドの最適化
Docker Build Cloudはリモートでビルドを実行し、ビルドを開始したマシン上では実行されません。これにより、クライアントとビルダーの間でファイル転送がネットワーク経由で行われます。
ネットワーク経由のファイル転送は、ローカル転送に比べて遅延が大きく、帯域幅も低くなります。Docker Build Cloudには、これを軽減するためのいくつかの機能があります:
- ビルドキャッシュのためにアタッチされたストレージボリュームを使用するため、キャッシュの読み書きが非常に高速です。
- ビルド結果をクライアントにロードする際には、以前のビルドと比較して変更されたレイヤーのみがプルされます。
これらの最適化にもかかわらず、リモートでのビルドでは、プロジェクトが大規模であったり、ネットワーク接続が遅い場合に、コンテキスト転送やイメージのロードが遅くなることがあります。以下の方法で、転送をより効率的に最適化することができます:
ビルドの最適化方法について詳しくは、ビルドのベストプラクティスをご覧ください。
Dockerignoreファイル
.dockerignore
ファイルを使用すると、ビルドコンテキストに含めたくないローカルファイルを明示的に指定できます。.dockerignore
ファイルに指定したglobパターンに一致するファイルは、リモートビルダーに転送されません。
.dockerignore
ファイルに追加したいものの例としては、次のものがあります:
.git
— バージョン管理の履歴をビルドコンテキストに送信しない。これにより、ビルドステップでgit rev-parse
などのGitコマンドを実行できなくなることに注意。- バイナリなどのビルド成果物が含まれるディレクトリ。開発中にローカルで生成されたビルド成果物。
- パッケージマネージャのベンダーディレクトリ(例:
node_modules
)。
一般的に、.dockerignore
ファイルの内容は .gitignore
ファイルの内容と似たものになるでしょう。
スリムベースイメージ
Dockerfileで FROM
命令に指定するイメージを小さなものにすることで、最終的なイメージのサイズを削減できます。Alpineイメージ は、Linuxコンテナで期待されるすべてのOSユーティリティを提供する、最小限のDockerイメージの良い例です。
また、特別な scratch
イメージ もあり、これは何も含んでいません。例えば、静的にリンクされたバイナリのイメージを作成するのに役立ちます。
マルチステージビルド
マルチステージビルド を使用すると、ビルドが並行して実行されるため、ビルドが高速になります。また、最終的なイメージを小さくすることもできます。Dockerfileを記述する際は、最終的なランタイムステージが可能な限り小さなベースイメージを使用し、プログラムの実行に必要なリソースのみを含むようにします。
また、Dockerfileの COPY --from
命令を使用して、他のイメージやステージからリソースをコピーすることもできます。このテクニックにより、最終ステージのレイヤーの数やサイズを削減できます。
ビルド中にリモートファイルを取得
可能な場合、ファイルをビルドコンテキストに含めるのではなく、ビルド中にリモートから取得する方が望ましいです。Docker Build Cloudサーバー上で直接ファイルをダウンロードする方が、ビルドコンテキストでファイルを転送するよりも高速になる可能性があります。
Dockerfileの ADD
命令や、wget
や rsync
などのツールを使った RUN
命令を使用して、ビルド中にリモートファイルを取得できます。
マルチスレッドツール
ビルド指示で使用するツールの中には、デフォルトで複数のコアを使用しないものもあります。例えば、make
はデフォルトでシングルスレッドを使用しますが、make --jobs=<n>
オプションを指定するとマルチスレッドで実行できます。このようなツールを使ったビルドステップでは、並列化して実行を最適化できるかどうか確認してください。