Java 如何将应用程序映射到docker卷

Java 如何将应用程序映射到docker卷,java,docker,java-ee-8,Java,Docker,Java Ee 8,我是docker的新手,我一直在尝试运行一个容器,在tomcat映像上部署我的Java web应用程序。问题是我的应用程序必须读写它在我的机器上访问的文件,显然,当应用程序的.war文件作为docker容器部署在tomcat上时,它无法找到该文件,因为该文件不再被识别。我试图看看如何解决这个问题,结果遇到了docker卷。我的想法是将我的文件存储在一个卷中,然后让我的应用程序从中检索数据,但我找不到一种方法。我一直在寻找一种方法,看看如何在我的应用程序中修改路径,以指向docker卷中的文件,但

我是docker的新手,我一直在尝试运行一个容器,在tomcat映像上部署我的Java web应用程序。问题是我的应用程序必须读写它在我的机器上访问的文件,显然,当应用程序的.war文件作为docker容器部署在tomcat上时,它无法找到该文件,因为该文件不再被识别。我试图看看如何解决这个问题,结果遇到了docker卷。我的想法是将我的文件存储在一个卷中,然后让我的应用程序从中检索数据,但我找不到一种方法。我一直在寻找一种方法,看看如何在我的应用程序中修改路径,以指向docker卷中的文件,但我找不到任何东西。也许我在试图了解更多关于docker卷的信息时遗漏了什么?请指出正确的方法,或者提供一个有用的链接,说明如何进行类似的操作,或者如果我对这种方法完全错误,请告诉我。

这是有关卷和挂载的官方文档

这是一个关于如何将mysql容器装载到驱动器的示例,即使容器被删除,也要保留数据。 查看“存储数据的位置”这一点

这是一个非常简短的版本,docker compose可以将容器内的文件夹装载到外部文件夹

volumes:
  - /var/mysql:/var/lib/mysql
*这是一个完整的docker compose文件中仅有的两行,但应该演示如何装载数据

“:”左侧的文件夹是驱动器上数据所在的文件夹 “:”左侧的文件夹,该文件夹在容器中引用

在文件夹“./datafolder”中查找文件时
您应该在文件夹中装入文件。/在容器中装入驱动器上包含“datafolder”的文件夹。

因此,假设我的应用程序必须访问文件test.txt,并且我成功地将该文件复制到以这种方式装入的数据卷中:-v/var/dir:/var/lib/dir,然后,我是否只需要修改应用程序中的路径以指向/var/lib/dir/test.txt?当您的文件test.txt位于卷上的/var/dir时,您的应用程序需要指向/var/lib/dir/test.txt。您的应用程序在容器外的卷/var/dir中搜索位于/var/lib/dir中的任何文件,如果您这样做:-v/var/dir:/var/lib/dirI,是否有任何方法确保文件test.txt在主机目录/var/dir中始终可用?与中一样,我是否可以在dockerfile中包含一个命令,将文件复制到我的应用程序映像中,以便在任何给定主机上拉取该映像时,将文件test.txt放入名为/var/dir的目录中,以便应用程序可以使用它?您可以将test.txt放入应用程序中,但这样您就不需要将容器内的卷装入外部卷。您可以查看shadowjar,它可以从您的应用程序中创建一个jar,并提供所需的一切。问题是,该文件的使用有点像数据库,因此我需要能够修改从不同容器装入同一卷的文件,以便所有容器都可以访问修改后的文件,例如,假设容器a将数据添加到卷vol上的test.txt,那么访问卷vol的容器b将能够使用添加到文件中的数据,同样的,如果数据被删除,所有容器都必须能够意识到该修改