【问题标题】:Connecting to an H2 Database in a Docker Container连接到 Docker 容器中的 H2 数据库
【发布时间】:2015-08-28 22:09:44
【问题描述】:

我有一个基本的 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 目录,以及它包含的所有文件,以便数据库可见,但这似乎不起作用。想法?

TIA, - 奥莱

【问题讨论】:

    标签: java spring maven jpa docker


    【解决方案1】:

    您应该使用 docker data volumes。运行容器时,您指定参数:

    -v <host folder>:<container folder> 
    

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

    例如:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 2021-04-05
        相关资源
        最近更新 更多