连接到Docker容器中的H2数据库

我有一个基本的Spring Boot Data JPA项目。 我要连接的h2数据库位于/tmp/customerdb.h2.db 。 当使用mvn spring-boot:run运行应用程序时mvn spring-boot:run一切正常。 应用程序连接到数据库,添加logging,并将添加的logging打印到控制台。

然后,我build立一个docker集装箱,并运行它。 docker文件如下所示:

 FROM java:8 VOLUME /tmp ADD jpa-docker-1.0.0.jar app.jar RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar",/app.jar"] 

当我运行容器时,出现以下错误:

 2015-06-12 19:25:57.200 WARN 1 --- [ main] ohengine.jdbc.spi.SqlExceptionHelper : SQL Error: 42102, SQLState: 42S02 2015-06-12 19:25:57.200 ERROR 1 --- [ main] ohengine.jdbc.spi.SqlExceptionHelper : Table "CUSTOMER" not found; SQL statement: 

所以看起来应用程序看不到数据库。 连接URL如下所示: spring.datasource.url=jdbc:h2:/tmp/customerdb

正如我所提到的,这在docker容器外运行时工作正常。 我假设Dockerfile VOLUME /tmp中的行在容器中创build了/tmp目录以及它包含的所有文件,这样数据库是可见的,但是这好像不起作用。 思考?

TIA – Ole

你应该使用docker 数据卷 。 运行容器时,指定参数:

 -v <host folder>:<container folder> 

这样,主机上的映射,在容器内

例如:

 docker run -v /tmp:/tmp -d yourcontainer 

您的应用程序在容器中查找文件/tmp/customerdb.h2.db ,实际上是在/tmp/customerdb.h2.db数据库文件实际存在的主机上(通常您可以在/tmp/customerdb.h2.db上使用不同的path和主机;在你的例子中,只是主机和来宾文件夹都在同一个位置“/ tmp”)

这是解决scheme。 首先,我添加了包含Dockerfile的数据库Dockerfile build目录。 然后我用下面一行更新Dockerfile

 ADD customerdb.h2.db /tmp/customerdb.h2.db 

应用程序现在可以连接到容器内的数据库。 请注意,包含在volume /tmp/中的数据库被限制在容器中,与我复制到工作站上的/tmp/目录中的数据库不同。