すべてのプロダクト
Search
ドキュメントセンター

Container Registry:Dockerfile最適化の推奨事項

最終更新日:Aug 13, 2024

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

警告

apt-get update、apt-get upgrade、およびapt-get install命令は、同じ命令で使用する必要があります。

apt-get update、apt-get upgradeapt-get install命令を同じRUN命令に組み合わせます。

R1003

警告

apt-get命令を実行してソフトウェアをダウンロードするときに不要なパッケージがダウンロードされないように、-- no-install-recommends命令を追加する必要があります。

apt-get install命令に -- no-install-recommends命令を追加します。

R1004

警告

ソフトウェアパッケージのキャッシュは、ソフトウェアパッケージがダウンロードされた後にイメージのサイズを縮小するためにクリアされなければならない。

  • apt-get cleanrm -rf /var/lib/apt/lists/* 命令をapt-get命令に追加します。

  • rm -rf /var/cache/apk/* 命令をapk命令に追加します。

  • -- no-cacheパラメーターをapk Add命令に追加します。

  • yum clean命令をyum命令に追加します。

R1005

警告

多段階構築は、画像のサイズを縮小するためにコンパイルコマンドを処理する際に使用することができる。

makeやgo buildなどの指示を別々のステージでコンパイルし、コンパイル結果をアプリケーションイメージにコピーします。 例:

高山からの

FROM alpine:3.17 as complie
COPY <source code> code/
RUN make
FROM alpine:3.17
COPY --from=compile /code/bin bin/

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命令に結合します。