イメージのビルドが失敗した場合、エラー出力は根本原因ではなく、現象のみを指し示していることがよくあります。ビルド診断は、ビルドタスクを分析して根本原因を明らかにし、潜在的なリスクにフラグを立て、最適化の機会を特定します。専門家のルールと Tongyi Qianwen 大規模言語モデル (LLM) を組み合わせて、的を絞った修正提案を生成します。
ビルド診断を使用すると、Alibaba Cloud は、リポジトリ情報、ビルド設定、ビルドタスクログ、ビルド履歴など、ご利用のコンテナイメージリポジトリからデータを収集します。ビルド設定に機密データを保存したり、ビルドログに機密データを出力したりしないでください。詳細については、「注意事項」をご参照ください。
仕組み
ビルド診断は、3 つのステージで実行されます:
-
データの前処理:インスタンスステータス、リポジトリ設定、ビルドルール、ビルドログを収集し、例外を迅速に検出します。
-
ルール検出:収集されたデータを分析し、例外、潜在的なリスク、最適化の機会を特定します。
-
根本原因分析:収集されたデータと検出結果を使用して、各問題の根本原因を特定し、修正提案を生成します。
診断結果は、次の 2 つのカテゴリに分類されます:
-
要修正項目:例外の根本原因、修正提案、例外箇所の詳細。
-
AI 診断:ビルド命令または設定項目の詳細な分析、および LLM によって生成された包括的な最適化の提案。
ビルド診断の実行
-
[イメージビルド診断] ページで [診断] をクリックします。[イメージビルドタスクの選択] パネルで、診断するビルドタスクを選択します:
-
[名前空間]:ビルドタスクが属する名前空間。
-
[イメージリポジトリ]:ビルドタスクが属するリポジトリ。
-
[イメージビルドタスク ID]:ビルドタスクの ID。
-
-
注意事項を読み、[理解し、同意します] を選択してから、[診断の開始] をクリックします。
-
診断が完了したら、結果を確認し、修正提案を適用します。各検出結果を理解するには、以下の診断ルールリファレンスをご参照ください。
診断ルールリファレンス
次の表に、すべての診断ルール、その根本原因、および修正提案を示します。
| ルールグループ | ルール名 | 根本原因 | 修正提案 |
|---|---|---|---|
| Dockerfile 構文検出 | 無効なポート定義 | EXPOSE 命令のポートまたはプロトコルのフォーマットが正しくありません。 |
ポート範囲が 0~65535 であり、プロトコルが TCP または UDP であることを確認してください。 |
| Dockerfile 構文検出 | コピー命令:宛先がディレクトリではない | 複数のファイルをコピーする際、宛先パスがディレクトリではありません。 | 宛先としてディレクトリパスを使用してください。 |
| Dockerfile 構文検出 | ビルドステージが存在しない | COPY 命令のステージ名が、定義済みのステージを参照していません。 |
Dockerfile の前半で定義されたステージ名を使用してください。 |
| Dockerfile 構文検出 | ステージ名の重複 | 2 つ以上のビルドステージが同じ名前を共有しています。 | 各ステージに一意の名前を使用してください。 |
| Dockerfile 構文検出 | 無効な最初の命令 | 最初の命令が FROM または ARG ではありません。 |
Dockerfile を FROM または ARG 命令で開始してください。 |
| Dockerfile 構文検出 | コンパイルエラー項目 | Dockerfile にプリコンパイルエラーが含まれています。 | 構文エラーを修正するか、根本原因分析による修正提案をお待ちください。 |
| Dockerfile 構文検出 | コンパイル警告項目 | Dockerfile にプリコンパイル警告があります。 | フラグが立てられた命令を確認してください。予期しない方法で実行される可能性があります。 |
| イメージタグ検出 | ベースイメージタグが指定されていない | FROM 命令でタグが指定されていません。 |
将来のビルドで意図しないバージョンがプルされるのを避けるため、特定のイメージタグを固定してください。 |
| イメージタグ検出 | ベースイメージが存在しない | ベースイメージ名が正しくないか、イメージが存在しません。 | イメージ名を確認するか、別のベースイメージを選択してください。 |
| ランタイムエラー検出 | コマンド実行エラー | Dockerfile 内のコマンドがエラーで終了します。 | Dockerfile 内のコマンドが正しいことを確認するか、根本原因分析による修正提案をお待ちください。 |
| ランタイムエラー検出 | コマンドが存在しない | 実行されるコマンドがベースイメージに存在しません。 | Dockerfile が実行するすべてのコマンドがベースイメージに存在することを確認してください。 |
| ランタイムエラー検出 | ファイルが存在しない | COPY 命令が、存在しないファイルまたはディレクトリを参照しています。 |
COPY 命令内のファイルまたはディレクトリのパスが正しいことを確認してください。 |
| 無効な命令の検出 | 無効なコマンド | ビルド中に Kill や Shutdown などの命令が使用されています。 |
Kill、Shutdown、および類似の命令を削除してください。これらはセキュリティと安定性の問題を引き起こします。 |
| 無効な命令の検出 | sudo コマンド | sudo が使用されています。 |
ビルドプロセスから sudo を削除してください。ビルド中に sudo を使用すると、コンテナビルドコンテキスト内では権限昇格が同じように機能しないため、予測不能な動作が発生します。 |
| アップロードステージでのエラー検出 | タグの競合 | プッシュするイメージタグが、リポジトリ内の既存のタグと競合しています。 | リポジトリのイメージタグの不変性機能を無効にするか、同じタグへの繰り返しプッシュを避けてください。 |
| イメージサイズの最適化 | apt-get: update と install の分離 | apt update と apt install が別々の RUN 命令にあります。 |
apt-get update と apt-get install を単一の RUN 命令にまとめます。Docker は各 RUN レイヤーを個別にキャッシュします。apt-get update があるレイヤーで実行され、apt-get install が別のレイヤーで実行されると、後続のビルドでパッケージをフェッチする際にキャッシュされた apt-get update レイヤーが再利用される可能性があります。これにより、パッケージバージョンが古くなり、イメージサイズが大きくなります。 |
| イメージサイズの最適化 | apt-get: --no-install-recommends の欠落 | apt-get install に --no-install-recommends フラグが含まれていません。 |
オプションの推奨パッケージをスキップしてイメージを小さく保つために、apt-get install に --no-install-recommends を追加してください。 |
| イメージサイズの最適化 | パッケージキャッシュがクリアされていない | インストール後にパッケージマネージャのキャッシュが削除されていません。 | パッケージをインストールするのと同じ RUN 命令でキャッシュをクリアします。Ubuntu では apt-get clean を、Alpine では apk add --no-cache または rm -rf /var/cache/apk/* を、CentOS では yum clean を使用します。同じ命令でクリアすることで、キャッシュがイメージレイヤーにコミットされないようにします。 |
| イメージサイズの最適化 | マルチステージビルドが使用されていない | コンパイルが最終イメージステージで行われています。 | コンパイルを別のビルドステージに移動し、ビルド出力のみをビジネスイメージにコピーします。これにより、コンパイラツールチェーンと中間アーティファクトが本番イメージに含まれないようになります。 |
| イメージサイズの最適化 | 圧縮パッケージが削除されていない | ビルド中にダウンロードされたアーカイブが削除されていません。 | ダウンロード、展開、削除のステップを単一の RUN 命令にまとめることで、アーカイブがイメージレイヤーにコミットされないようにします。 |
| ビルド命令の最適化 | 相対 WORKDIR パス | WORKDIR が相対パスを使用しています。 |
WORKDIR には絶対パスを使用してください。相対パスはベースイメージの現在の作業ディレクトリに対して解決されますが、これはベースイメージのバージョン間で変更される可能性があり、予期しないビルドの失敗を引き起こす可能性があります。 |
| ビルド命令の最適化 | ビルド中の root ユーザー | ビルドが root ユーザーに切り替わります。 | root に切り替える命令を削除してください。ビルド中に root として実行すると、コンテナランタイムでセキュリティリスクが発生する可能性があります。 |
| ビルド命令の最適化 | WORKDIR の代わりに cd を使用 | cd は、ビルド中にディレクトリを変更するために使用されます。 |
cd を WORKDIR 命令に置き換えてください。RUN ステップで cd を使用して行われたディレクトリの変更は、次のステップやコンテナのランタイムには引き継がれません。WORKDIR のみがレイヤーを越えて作業ディレクトリを変更します。 |
| ビルド命令の最適化 | 複数の CMD または ENTRYPOINT 命令 | Dockerfile に複数の CMD または ENTRYPOINT 命令があります。 |
最後の CMD または ENTRYPOINT 命令のみが有効になります。意図した最終的な命令以外はすべて削除してください。 |