我想在应用程序的官方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'目录,生产网络无法访问下载插件文件。我需要在编译和构建时间之前将这些插件捆绑在一起,然后将生成的图像发布到生产环境中。 –