DockerのONBUILD
命令を使用すると、画像内にトリガーを設定できます。トリガーは、後で画像が別の画像のベースとして使用されるときに実行されます。これらは新しいダウンストリームイメージコンテキストの一部になり、最初のdocker build
のファイルシステムレイヤーにはなりません。 。
ONBUILDトリガーの追加
ONBUILD
Dockerfileに書き込む命令です。 別のを受け入れるのでユニークです その引数としての命令。 COPY
などのDockerfile操作を指定できます またはRUN
、およびダウンストリームイメージビルド中に実行されます。
ONBUILD RUN example-command
この例では、example-command
を実行します 作成時の子イメージで。ファイルがダウンストリームイメージのビルドコンテキストからファイルシステムにコピーされる別のケースは次のとおりです。
ONBUILD COPY assets.json /app/assets.json
ONBUILD
命令は、それらが定義されているDockerfileによって生成されたイメージにはまったく影響しません。上記のDockerfileをビルドしても example-command
を実行します またはassets.json
を含めます 画像内:
# Does not include the extra instructions docker build -t base-image:latest .
トリガーは、最初のDockerfileをベースとして使用する別のDockerfileを作成するときに使用されます。
FROM base-image:latest RUN my-binary
docker build -t downstream-image:latest .
このDockerfileをビルドすると、example-command
が実行されます 、assets.json
にコピーします 、最後にmy-binary
を実行します 。 ONBUILD
トリガーは常に最初に実行され、FROM
の直後に実行されます ダウンストリームDockerfileの命令。
Dockerはトリガーをどのように認識しますか?
ONBUILD
ベースコンテナのファイルシステムには影響しませんが、Dockerは、ダウンストリームイメージを作成するときにトリガーが存在することを認識しています。ビルドプロセスはONBUILD
を追跡します 指示を見つけて画像のメタデータに記録します。
Dockerは、FROM
で参照されている画像のメタデータを検査します 命令。名前付きイメージのメタデータにトリガーが含まれている場合、それらのトリガー命令は、ビルドが開始される前にダウンストリームDockerfileの先頭に効果的に貼り付けられます。
トリガーは、実際にはビルドのFROM
の一部として実行されます ステージ。これらは、アップストリームのDockerfileに書き込まれた順序で実行されます。 ONBUILD
の場合 命令が失敗すると、Dockerはビルドをキャンセルし、FROM
のようになります。 ステージが原因でした。
ONBUILD
の引数として任意のDockerfile命令を使用できます 3つの例外を除いてトリガー:
-
ONBUILD FROM
–ビルドに使用されるベースイメージを上書きするため、これは許可されていません。各Dockerfileは、単一のベースから継承する必要があります。 -
ONBUILD MAINTAINER
–MAINTAINER
命令は非推奨であり、使用しないでください。著者情報は、ラベルとして提供するのが最適です。LABEL
命令はONBUILD
と互換性があります 。 -
ONBUILD ONBUILD
–ONBUILD
の連鎖 命令はサポートされていません。すべてのトリガーは、Dockerfileのすぐ下流のイメージで実行されます。定義中のDockerfileの2レベル以上下の「孫」イメージで実行することを目的としたトリガーを定義することはできません。
すべての命令は、通常の使用と同じ方法で定義されます。 Dockerfileに通常のステップを記述し、その前にONBUILD
を付けます 、通常のビルドフローから移動し、代わりにダウンストリームビルドトリガーにします。
ONBUILDトリガーはいつ役に立ちますか?
ONBUILD
コードのコンパイルなどのタスクを自動化するユーティリティイメージ内で最も一般的に使用されます。この種の手順では、通常、特定のポイントでソースコードなどの依存関係を追加して、特定の順序でいくつかのステップを実行する必要があります。
ディレクトリ内のソースコードを検索し、コマンドを実行してビルドするコンパイルイメージについて考えてみます。単純にCOPY
することはできません およびRUN
エンドユーザーのソースがあなたの内に存在しないため、そのイメージのDockerfile内に 画像のビルドコンテキスト。
ONBUILD
を使用する ユーザーが拡張してdocker build
できる定型のDockerfileを提供できます 共通の機能を再発明することなく:
ENV BUILD_ENV=production RUN init-build.sh ONBUILD COPY /src /build ONBUILD RUN compile.sh --destination=/bin
この例は、ビルダーイメージが事前構成されたコンパイル環境を提供する方法を示しています。ベースイメージとして使用する場合、コードはダウンストリームビルドコンテキストから自動的にコンパイルされます。その画像は、/bin
のコンパイル済み出力と相互作用する可能性があります 独自のDockerfileステージ内。
ONBUILD
Dockerfilesの命令は、ダウンストリームビルドの一部としてトリガーを実行する方法を提供します。他のDockerfile命令をONBUILD
として使用できます いくつかの制限を除いて、トリガーします。
ONBUILD
を使用する 再利用可能な機能のセットを定義する汎用Dockerイメージを提供できます。これは、ユーザーにDockerfilesの例のテキストを逐語的にコピーしてから、下部に独自の指示を追加させるよりも効率的です。ユーザーの操作を必要とせずに、ベースイメージを変更および更新できます。
ONBUILD
を採用 繰り返しを減らし、拡張可能なDockerベースイメージを容易にします。 ONBUILD
ボイラープレートDockerfileを作成するときは、最終的なコンテナ環境が完成したと見なされる前にエンドユーザーがカスタマイズする必要がある手順を検討する価値があります。