Container Registryは、Container Registry Enterprise Editionインスタンスでのイメージ構築タスクのDockerfile最適化推奨機能を提供します。 この機能は、Dockerfilesの潜在的な問題を特定して、コンテナイメージの品質を向上させるのに役立ちます。 この機能は画像構築には影響しません。 操作を実行することなく、ログの作成時に最適化の推奨結果を表示できます。 このトピックでは、コンテナイメージの品質を向上させ、エンタープライズレベルのアプリケーションの要件を満たすために、Dockerfile最適化推奨の結果に基づいてDockerfileの潜在的な問題を特定する方法について説明します。
背景情報
Container Registry Enterprise Editionが提供するイメージ構築サービスを使用すると、Container Registryは、Container Registryがイメージを構築する前に、Dockerfilesを自動的に最適化および推奨できます。 Container Registryは、Dockerfile最適化推奨機能を使用して、構文ルールとベストプラクティスルールに基づいてDockerfilesを分析し、分析結果を提供します。 構文ルールの詳細については、「Dockerfile reference」をご参照ください。
分析結果は、次のレベルの問題に分けられます。
エラー: Dockerfileには、Container Registryでサポートされていない構文エラーまたは建物パラメーターが含まれています。 エラーレベルの問題は、イメージビルディングでエラーを引き起こす可能性があります。 エラーレベルの問題を修正する必要があります。
警告: Dockerfileには潜在的な問題が含まれています。 警告レベルの問題は、予期しない画像構築結果や画像内の冗長データを引き起こす可能性があります。
分析結果の形式
構文検出結果
[Error] <Error message> at line <line number>: <Specific instruction content>
[Warning] <Warning message> at line <line number>: <Specific instruction content>
[Error] [Rule <Rule id>] <Error message> at line <line number>: <Specific instruction content>
[Warning] [Rule <Rule id>] <Warning message> at line <line number>: <Specific instruction content>例 1
Dockerfileに構文エラーが含まれています。
# The FROM instruction uses a base image of an unsupported architecture and does not specify the names of the stages in multi-stage building.
FROM --platform=windows alpine as
# The RUN instruction uses unsupported running parameters.
RUN --security=insecure cat /proc/self/status | grep CapEff
# No destination path is specified in the ADD instruction.
ADD https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
# The COPY instruction does not support copying of remote files.
COPY https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz linux-0.01.tag.gz
# The source file path that is specified in the COPY/ADD instruction does not exist in the building path.
COPY <Path that does not exist> /somedir/
# The name of the instruction is invalid.
CPY /foo /bar次のコードは、前述のDockerfileの構文検出結果を提供します。
[parse stage begin.]
[Error] Unsupported target architecture at line 2: windows.
[Error] Lack of stage name at line 2.
[Error] Unsupported security mode at line 4: insecure.
[Error] Lack of dest at line 6.
[Error] COPY does not support remote links. Please use the ADD instruction at line 8: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz.
[Error] Source path is not exist at line 10: <Path that does not exist>.
[Error] Unknown instruction at line 12: CPY.
[Warning] No tag specified at line 2: from ["--platform=windows"] "alpine" "as".
[parse successfully, takes 0s.]例 2
Dockerfileはベストプラクティスのルールに準拠していません。
# No image tag is specified.
FROM alpine AS a
# The cache of the software package is not cleared after the software is installed.
RUN apk add gcc
# No image tag is specified. An existing stage name is used.
from ubuntu as a
# The cache of the software package is not cleared after the software is installed. No --no-install-recommends instruction is used to prevent unnecessary software packages from being downloaded.
RUN apt-get install -y gcc次のコードは、前述のDockerfileの構文検出結果を提供します。
[parse stage begin.]
[Warning] [Rule1003]When installing software with apt-get, it is recommended to include the --no-install-recommends parameter at line 8: RUN apt-get install -y gcc .
[Warning] No tag specified at line 2: FROM alpine AS a .
[Warning] No tag specified at line 6: from ubuntu as a .
[Warning] [Rule1001]Using a base image with a specific tag instead of the latest image.
[Error] Duplicate stage names with line 2: a at line 6: from ubuntu as a .
[Error] [Rule1014]Do not use duplicate stage names.
[parse successfully, takes 0s.]検出ルール
ベストプラクティスのルール
ルール番号 | 問題レベル | 建物ルール | 推奨設定 |
R1001 | 警告 | Latestタグを持つ画像は、ベース画像として使用できません。 | 特定のタグの画像をベース画像として指定します。 |
R1002 | 警告 |
|
|
R1003 | 警告 |
|
|
R1004 | 警告 | ソフトウェアパッケージのキャッシュは、ソフトウェアパッケージがダウンロードされた後にイメージのサイズを縮小するためにクリアされなければならない。 |
|
R1005 | 警告 | 多段階構築は、画像のサイズを縮小するためにコンパイルコマンドを処理する際に使用することができる。 | makeやgo buildなどの指示を別々のステージでコンパイルし、コンパイル結果をアプリケーションイメージにコピーします。 例: 高山からの |
R1006 | 警告 | WORKDIR命令を使用して作業ディレクトリを指定すると、命令で相対パスを使用すると、システムが予期しないパスを使用する可能性があります。 | 相対パスの代わりに絶対パスを使用します。 |
R1007 | エラー | ビルドプロセス中にKillやShutdownなどの指示を実行すると、セキュリティと安定性の問題が発生する可能性があります。 | 関連する手順を削除します。 |
R1008 | 警告 | イメージ構築にRootユーザーを使用すると、コンテナーランタイムでセキュリティ上の問題が発生する可能性があります。 | イメージの構築にRootユーザーを使用しないでください。 |
R1009 | 警告 | イメージ構築でCD命令を使用して作業ディレクトリを指定した場合、作業ディレクトリはコンテナーランタイムでは有効になりません。 | CD命令の代わりにWORKDIR命令を使用する。 |
R1010 | エラー | イメージ構築におけるSudoの指示は無効です。 | sudoの指示を削除します。 |
R1011 | エラー | EXPOSE命令を使用してポートを公開する場合、ポート番号は0〜65535の範囲で、プロトコルはTCPまたはUDPである必要があります。 | 有効なEXPOSEパラメーター (8080、8081/tcp、8082/udpなど) を使用します。 |
R1012 | エラー | COPY命令を使用して複数のソースファイルをコピーする場合、宛先パスの形式はディレクトリである必要があります。 | 宛先パスの形式がディレクトリであることを確認してください。 |
R1013 | エラー | COPY命令を使用して別のビルディングステージからファイルをコピーする場合、他のビルディングステージの名前は有効でなければなりません。 | 入力する他のステージの名前が、定義したステージの名前であることを確認します。 |
R1014 | エラー | 多段階の建物を使用する場合、ステージの名前は互いに異なる必要があります。 | ステージごとに一意の名前を使用します。 |
R1015 | エラー | Dockerfileの最初の命令はFROMまたはARG命令でなければなりません。 | 最初の命令がFROMまたはARG命令であることを確認します。 |
R1016 | 警告 | イメージ構築で複数のCMD命令を使用する場合、最後のCMD命令のみが有効になります。 | 最後のCMD命令が使用する命令であることを確認してください。 |
R1017 | 警告 | イメージ作成で複数のENTRYPOINT命令を使用する場合、最後のENTRYPOINT命令のみが有効になります。 | 最後のENTRYPOINT命令が使用する命令であることを確認します。 |
R1018 | エラー | ADD命令を使用して複数のソースファイルをコピーする場合、宛先パスの形式はディレクトリである必要があります。 | 宛先パスの形式がディレクトリであることを確認してください。 |
R1019 | 警告 | ソフトウェアパッケージを解凍した後、圧縮されたパッケージを削除してイメージのサイズを縮小できます。 | パッケージのダウンロード、パッケージの解凍、およびパッケージの削除に使用される命令を同じRUN命令に結合します。 |