2017-07-20 12 views
0

アプリケーションの公式ドッカーベースイメージにカスタムプラグインを含めて有効にしたいと思います。Dockerfileのループ/反復

ここに、ディレクトリ構造の外観を示します。私は、プラグインplugin_1plugin_3plugin_7plugin_8を含める必要がある場合

. 
+-- Dockerfile 
+-- plugins 
| +-- plugin_1 
| +-- plugin_2 
| +-- plugin_3 
| +-- ... 
| +-- plugin_n 

Dockerfileは、次のようになります。

FROM myapp_officialimage 

COPY plugins/plugin_1/* /usr/lib/myapp/plugins/ 
RUN myapp-plugins.sh enable plugin_1 

COPY plugins/plugin_3/* /usr/lib/myapp/plugins/ 
RUN myapp-plugins.sh enable plugin_3 

COPY plugins/plugin_7/* /usr/lib/myapp/plugins/ 
RUN myapp-plugins.sh enable plugin_7 

COPY plugins/plugin_8/* /usr/lib/myapp/plugins/ 
RUN myapp-plugins.sh enable plugin_8 

CMD ["myapp-start.sh"] 

質問あり、それは上記の定型を解消するために、リストの上に/ループを反復することは可能でしょうか?

たとえば、以下のようなDockerファイルは、よりクリーンでメンテナンス性に優れています。あなたのケースでは

FROM myapp_officialimage 

ENV CUSTOM_PLUGIN_LIST="plugin_1 plugin_3 plugin_7 plugin_8" 

for plugin in $CUSTOM_PLUGIN_LIST; \ 
do \ 
    COPY plugins/$plugin/* /usr/lib/myapp/plugins/ \ 
    RUN myapp-plugins.sh enable $plugin \ 
done 

CMD ["myapp-start.sh"] 
+2

これは、すべてのプラグインの画像に2つのレイヤーを作成します。シェルスクリプトでこれを行うことはできませんか?それは1つの 'RUN'になります。 – Grimmy

+0

これらのプラグインは何らかの形でパッケージとしてダウンロードできますか?次に、要件リストを作成し、パッケージをイメージにダウンロードします。 – Grimmy

+0

'docker build'はビルドサーバーで行われ、ビルドされたイメージは本番環境で実行されます。本番環境のホストには 'plugins'ディレクトリはなく、本番ネットワークにはプラグインファイルをダウンロードするためのアクセス権がありません。コンパイルとビルド時にこれらのプラグインを手作業でバンドルし、その結果のイメージをプロダクションに送る必要があります。 –

答えて

0

私はそれらを一緒にインストールします(多分生成または手作りの)スクリプトを使用して新しいプラグインフォルダを作成します。実際のプラグインフォルダを.dockerignoreに追加します。次に、新しいフォルダにコピーして、インストールスクリプトを実行します。これにより、ビルドを開始する前にドッカーにアップロードするコンテキストのサイズも小さくなります。あなたは手作業で依存関係を選んでいるので、事前に(buildの前に)作業をうまく動作させる必要があります。あなたが何かを行う必要があり、ビルドシステムで

は:

collect_plugins.sh # Creates the new plugin folder and install script 
docker build <params> 

二つの層は、次のようになります。

COPY plugins_selected/ /usr/lib/myapp/plugins/ 
RUN /usr/lib/myapp/plugins/install.sh 

あなたはそれを作るだろうドッカーするために、送信されているコンテキストを準備している場合Dockerfileもっとシンプル(良いこと)。我々は単にbuildの前に問題を解決しています。

通常、依存関係は、パッケージマネージャーを使用してネットワーク経由で取得されるか、単にhttp(s)を介してダウンロードされます。あなたが行っているようにビルドコンテキストにそれらをコピーすることは必ずしも間違っているとは言えませんが、少し面倒です。

ドッカーがどのようにしてDockerfileを処理するかを見てみましょう(わずかに簡略化されています)。

buildとすると、dockerはコンテキスト内のすべてのファイルをドッカーエンジン(.dockerignoreに記載されているパスを除く)にアップロードし、Dockerfileの処理を開始します。最終的なイメージを表すファイルシステムレイヤを生成することを目的としています。

RUNのような操作を実行すると、dockerは実際にコマンドを実行するためにコンテナを開始し、結果のレイヤーをイメージに追加します。プロダクションで実際に実行されるのは、およびの末尾に指定したものだけです。

可能な限り少ないレイヤーを作成してください。

dockerfile best practices guide covers the basics