【正解】C
【0からの解説】
①前提知識:Docker イメージは、Dockerfile の各命令ごとに作られる「レイヤ」の積み重ねでできています。ローカルの Docker では、変更のないレイヤは前回のビルド結果(レイヤ キャッシュ)を再利用するため、2 回目以降のビルドが速くなります。しかし Cloud Build では各ビルドが新しい使い捨ての環境で実行されるため、前回のレイヤ キャッシュが残っておらず、毎回すべてのレイヤを最初から作り直すことになります。
・--cache-from:docker build に「このイメージのレイヤをキャッシュとして使ってよい」と指示する引数です。Cloud Build の公式ドキュメント「ビルドを高速化する際のベスト プラクティス」では、前回ビルドして Artifact Registry に push したイメージを最初のステップで docker pull し、docker build に --cache-from でそのイメージを指定する方法が紹介されています(他の方法として Kaniko キャッシュもあります)。
②要件の整理:「同じレイヤを持つイメージを参照する複数の連続したステップ」「パイプラインの実行に時間がかかる」「Docker イメージのビルド プロセスを最適化したい」。同じレイヤを何度もビルドし直していることが遅さの原因と考えられます。
③正解の理由:C のように --cache-from でキャッシュ元のイメージを指定すれば、変更のないレイヤ(ベースイメージや依存ライブラリのレイヤなど)は再ビルドせずに再利用され、Java のビルドを含むビルド時間を大幅に短縮できます。Cloud Build が公式に推奨している高速化手法です。
【誤りの選択肢】
A:--squash は新しく作ったレイヤを 1 つにまとめてイメージを小さくする(実験的な)オプションです。レイヤが 1 つにまとまると、むしろ一部の変更でもレイヤ全体を作り直すことになり、キャッシュによる再利用が効きにくくなります。ビルド時間の短縮にはつながりません。
B:プライベート プールは、VPC 内のリソースへのアクセスや、より大きなマシンタイプ、ネットワークの制御が必要な場合に使う専用のワーカー プールです。マシンを大きくすれば多少速くなる可能性はありますが、同じレイヤを毎回作り直すという根本原因は解消されず、コストも増えます。
D:Cloud CDN は Web コンテンツをエンド ユーザーに近いエッジでキャッシュして配信する仕組みで、Docker ビルドのレイヤ キャッシュとは無関係です。また、コンテナ イメージの保存先としては Artifact Registry を使うのが推奨であり、Cloud Storage に移しても Cloud Build のビルドは速くなりません。
【参考】
ビルドを高速化する際のベスト プラクティス | Cloud Build