好的回答有点晚,但我希望这会在未来对某人有所帮助。
TL:DR 版本:我需要为脚本文件夹添加卷,因此我的 docker-compose.yml 被扩展:
volumes:
...
- ./_init_scripts:/usr/init-data
然后使用 SPRING_DATASOURCE_DATA 指向它:
- SPRING_DATASOURCE_DATA=file:/usr/init-data/${DATA}
我正在使用 .env
文件来存储我的配置,但只要 docker 环境中存在脚本并且路径有效,它就应该可以工作。例如。
- SPRING_DATASOURCE_DATA=file:/usr/some/path/to/file/mySqlFile.sql
这是 **TL:DR 版本 ** 现在是完整的故事,如果有人想更好地对其进行分析:
我有这样的“docker project”文件夹结构:
DockerProjectRoot
\_ _databases
| \_ myDatabase.mv.db
|
|_ _enviroments
| \_ env.myenv
|
|_ _init_scripts
| \_ someData.sql
|
|_ backend-service
| |_ ...
| \_ Dockerfile
|
|_ frontend-service
| |_ ...
| \_ Dockerfile
|
|_ docker-compose.yml
目录:
-
_databases
- 运行时数据库目录
-
_enviroments
- 用于存储 .env
文件的目录,因此我可以使用简单的 docker-compose --env-file ._enviroments/.env.myenv up
命令启动不同的环境并仅更改 .env
文件
-
_init_scripts
- 创建新数据库时,我将放置 data.sql
个文件的目录,这些文件需要在不同的环境中执行
-
backend-service
- 后端应用
-
frontend-service
- 前端应用
env.myenv
的内容是:
DB=myDatabase
DATA=someData.sql
以及docker-compose.yml
的内容
version: '3'
services:
backend-service:
build: ./backend-service
volumes:
- ./_databases:/usr/lib/h2
- ./_init_scripts:/usr/init-data
ports:
- 8080:8080
environment:
- SPRING_DATASOURCE_URL=jdbc:h2:file:/usr/lib/h2/${DB}
- SPRING_DATASOURCE_DRIVERCLASSNAME=org.h2.Driver
- SPRING_DATASOURCE_USERNAME=SA
- SPRING_DATASOURCE_PASSWORD=
- SPRING_JPA_HIBERNATE_DDL-AUTO=update
- SPRING_DATASOURCE_INITIALIZATION-MODE=always
- SPRING_DATASOURCE_DATA=file:/usr/init-data/${DATA}
frontend-service:
build: ./frontend-service
ports:
- 3000:80
depends_on:
- backend-service
所以当我运行 docker-compose --env-file ._enviroments/.env.myenv up
时,它会使用环境变量:DB 和 DATA 指向数据库位置和初始脚本。所以我的 enviroment
动态值是:
-
SPRING_DATASOURCE_DATA=file:/usr/init-data/someData.sql
- 需要注意的是它是 docker 容器内的完整路径,并且它连接到我的 docker 项目文件夹内的 _init_scripts
文件夹!
-
SPRING_DATASOURCE_URL=jdbc:h2:file:/usr/lib/h2/myDatabase
- 再次因为 docker 镜像是通过“volume”连接的,这意味着 myDatabse.mv.db
将在环境重启之间更新
所以最后如果我想添加新的 init 脚本,我只需要将新的 .sql
文件添加到 _init_scripts
文件夹并更新或创建新的 .env 文件。
本文链接:https://www.f2er.com/1212804.html