在 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的主要内容,如果未能解决你的问题,请参考以下文章