我想在應用程序的官方Docker基礎映像中包含並啓用一些自定義插件。Dockerfile中的循環/迭代
下面是目錄結構的樣子;
.
+-- Dockerfile
+-- plugins
| +-- plugin_1
| +-- plugin_2
| +-- plugin_3
| +-- ...
| +-- plugin_n
Dockerfile如下所示,如果我需要包括插件plugin_1,plugin_3,plugin_7和plugin_8;
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"]
問題是,是否有可能重複/遍歷一個列表,以消除上述樣板?
例如,像下面這樣的Dockerfile會更乾淨,更易於維護;
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"]
這將爲每個插件在圖像中創建兩個圖層。你不能用shell腳本來做到這一點嗎?那將是一個'RUN'。 – Grimmy
這些插件可以以某種形式下載爲包嗎?然後,您將製作需求清單並將軟件包下載到映像中。 – Grimmy
'docker build'發生在構建服務器上,而構建的映像將在生產環境中執行。生產中的主機不包括'plugins'目錄,生產網絡無法訪問下載插件文件。我需要在編譯和構建時間之前將這些插件捆綁在一起,然後將生成的圖像發佈到生產環境中。 –