使用dockerfile跨多个docker实例共享tomcatconfiguration?

我正在运行多个具有bitnami/tomcat映像的Docker容器,我想只在所有实例中共享只读configuration。

每个实例都将包含相同的configuration,如特定的库,数据源等。 我已经有了在物理Tomcat服务器中使用的经过validation和testing的configuration。 我看到这个configuration可以在任何实例运行之前做好准备。

可以将应用程序部署到每个实例(在configuration共享后实际复制一次),并且可以通过将WAR文件复制到指向容器中的/bitnami文件夹的主机文件夹${persistence_path}/tomcat/data/bitnami

 -v ${persistence_path}:/bitnami 

运行实例时 。

这个问题

我正在寻找一种可重复的创build实例的方法,以便通过脚本或者dockerfile来创build实例,而不是提交新图像 ,因为它不能提供如何创build图像的可靠logging。 通过使用前者,我避免了图像腐败或生产中丢失的机会。

如上所述,我可以在多个实例中共享configuration吗?

这是最好的方法,因为我不会在实例启动后修改任何tomcat设置,如果是这样的话,我可以重新运行新configuration的实例,以改变一次,并反映在每个实例?

可以用dockerfile而不是一组命令来完成吗? 我不认为-vVOLUME完全可以互换。

您可以使用-v:ro选项将目录挂载为只读目录

 docker run -v /your/host/dir:/bitnami:ro YOUR_IMAGE 

您可以从bitnami/tomcat开始创build自己的tomcat映像,包括在映像构build时复制工件和configuration。 然后,您可以使用-v选项在运行时覆盖它们。

如果你想要不可变的容器(构build时间数据被locking),你应该为每个服务构build一个映像。 否则,您可以使用卷绑定方法,如图像描述中所述 。

bitnami/tomcat映像使用简单的机制来决定是从卷恢复数据还是初始化卷。

启动时容器将检查/bitnami/tomcat/.initialized文件是否存在。

  • 如果此文件不存在 :容器将configurationTomcat,并将/opt/bitnami/tomcat/{conf,data}文件夹移动到卷上(这是在第一次运行时发生的)。 然后,它会将原始文件夹链接到卷中的文件夹。

第一次运行后的Tomcat文件夹:

 root@2346ab1f5c88:/# ls -la /opt/bitnami/tomcat/{conf,data} lrwxrwxrwx 1 root root 20 Sep 28 13:49 /opt/bitnami/tomcat/conf -> /bitnami/tomcat/conf lrwxrwxrwx 1 root root 20 Sep 28 13:49 /opt/bitnami/tomcat/data -> /bitnami/tomcat/data 
  • 如果此文件存在 :容器将只将Tomcat conf和data文件夹链接回卷中的文件夹(也许修复权限)。

因此,卷结构遵循以下模式。

 root@2346ab1f5c88:/# tree -L 1 -a /bitnami/tomcat /bitnami/tomcat ├── conf ├── data └── .initialized 2 directories, 1 file 

如果你想添加自己的configuration,你应该在Tomcat初始化发生时(运行时)覆盖/opt/bitnami/tomcat/conf中的默认configuration, /opt/bitnami/tomcat/conf在构build时覆盖/opt/bitnami/tomcat/conf中的默认configuration。

这意味着你可以:

  • bitnami/tomcat扩展,并将您的configuration复制到/opt/bitnami/tomcat/conf
  • 在运行时将configuration挂载到容器(到已知文件夹),并修改app-entrypoint.sh文件以覆盖/bitnami/tomcat/conf文件夹。
  • 在运行时将configuration复制到容器(与上面相同,但是使用docker cp复制)
  • 至less运行一次Tomcat容器,然后使用您的configuration覆盖本地卷中的conf文件夹。