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

时间:2015-06-12 19:32:28

标签: java spring maven jpa docker

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

然后我构建一个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] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 42102, SQLState: 42S02
2015-06-12 19:25:57.200 ERROR 1 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Table "CUSTOMER" not found; SQL statement:

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

正如我所提到的,当在docker容器外面运行时,这可以正常工作。我假设Dockerfile VOLUME /tmp中的行在容器内创建了/tmp目录,以及它包含的所有文件,这样数据库就可见了,但这看起来像是#&# 39;不工作想法?

TIA, - Ole

2 个答案:

答案 0 :(得分:1)

这是解决方案。首先,我添加了包含Dockerfile的数据库docker build目录。然后我使用以下行更新Dockerfile

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

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

答案 1 :(得分:1)

您应该使用泊坞窗data volumes。运行容器时,请指定参数:

-v <host folder>:<container folder> 

这样,主机上的映射就会映射到容器

例如:

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

您在容器中的应用程序会查找文件/tmp/customerdb.h2.db,该文件实际位于/tmp/customerdb.h2.db的主机上,其中db文件实际存在(通常,您可以在guest虚拟机和主机上使用不同的路径;在您的示例中,主机和来宾文件夹都位于同一位置“/ tmp”)