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を作成するときは、最終的なコンテナ環境が完成したと見なされる前にエンドユーザーがカスタマイズする必要がある手順を検討する価値があります。