在 docker 容器中运行我的 spring 应用程序时清空 h2 db

Posted

技术标签:

【中文标题】在 docker 容器中运行我的 spring 应用程序时清空 h2 db【英文标题】:Empty h2 db when running my spring app in docker container 【发布时间】:2021-12-28 23:11:32 【问题描述】:

我有一个使用 H2 持久 DB 的 spring 应用程序,其中有一个文件位于我的机器上。

如果我在 docker 容器之外运行应用程序,则数据库不为空。如果我在 docker 中运行应用程序,数据库将变为空。我读了这篇文章:Connecting to an H2 Database in a Docker Container 并尝试添加卷。据我了解,码头工人可以将本地数据库文件保存在带有卷的容器中。但似乎我还没有让它工作,因为数据库仍然是空的。谁能帮帮我?

application.properties

spring.datasource.url=jdbc:h2:./TESTDB/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto= update

spring.h2.console.enabled=true
spring.h2.console.path=/h2-ui
spring.h2.console.settings.web-allow-others=true

Dockerfile

FROM azul/zulu-openjdk-alpine:11

ARG JAR_FILE=target/*.jar

COPY $JAR_FILE app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

我这样运行容器:

docker run -v ./TESTDB:/TESTDB -p 8080:8080 test-container

【问题讨论】:

【参考方案1】:

-v ./TESTDB:/TESTDB 不是非法的 Docker 挂载规范吗?通常,你会得到这个:

docker: Error response from daemon: create ./TESTDB: "./TESTDB" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.

试试:

docker run -v $(pwd)/TESTDB:TESTDB -p 8080:8080 test-container

(假设您使用的是 Linux 或 macOS 等操作系统)

【讨论】:

以上是关于在 docker 容器中运行我的 spring 应用程序时清空 h2 db的主要内容,如果未能解决你的问题,请参考以下文章

在Docker容器中运行Spring Boot GraalVM原生镜像

无法从Spring Boot Docker容器连接到本地MySQL数据库服务器

如何更改 docker 容器中的时区?

使用 Spring Boot 代码运行 docker 容器

如何对 Docker 容器中运行的 Spring Boot 应用程序进行健康检查?

两个 docker 容器之间的通信问题