如何将 spring.datasource.data 从 docker 作为完整路径传递?
How to pass spring.datasource.data from docker as full path?
这是我的 docker-compose.yml
文件。
version: '3'
services:
backend-service:
build: ./backend-service
volumes:
- ./backend-service/database:/usr/lib/h2
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=${DATA}
frontend-service:
build: ./frontend-service
ports:
- 3000:80
depends_on:
- backend-service
我想将完整的系统路径传递给 sql 文件,例如 /usr/tmp/someSql.sql
应该在服务器启动时执行的文件。我可以使用默认 data.sql 但问题是我将有多个服务器将具有不同的 initial/update 数据所以我不想将包含业务数据的多个文件放入 jar 中只是为了使其对 spring 引导和 docker.
但即便如此,如果我将所有文件放在资源文件夹中并将它们放在 jar 中并使用 someData.sql
作为值,它在启动期间也看不到该文件。
出于显而易见的原因,我也不想为用户创建端点以插入他们自己的 sql。
我已经尝试过 file:/usr/tmp/someSql.sql
但我仍然收到找不到文件的错误消息。
好吧,回答晚了一点,但我希望这对以后的人有所帮助。
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
将在环境重启之间更新
所以最后,如果我想添加新的初始化脚本,我只需要将新的 .sql
文件添加到 _init_scripts
文件夹并更新或创建新的 .env 文件。
这是我的 docker-compose.yml
文件。
version: '3'
services:
backend-service:
build: ./backend-service
volumes:
- ./backend-service/database:/usr/lib/h2
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=${DATA}
frontend-service:
build: ./frontend-service
ports:
- 3000:80
depends_on:
- backend-service
我想将完整的系统路径传递给 sql 文件,例如 /usr/tmp/someSql.sql
应该在服务器启动时执行的文件。我可以使用默认 data.sql 但问题是我将有多个服务器将具有不同的 initial/update 数据所以我不想将包含业务数据的多个文件放入 jar 中只是为了使其对 spring 引导和 docker.
但即便如此,如果我将所有文件放在资源文件夹中并将它们放在 jar 中并使用 someData.sql
作为值,它在启动期间也看不到该文件。
出于显而易见的原因,我也不想为用户创建端点以插入他们自己的 sql。
我已经尝试过 file:/usr/tmp/someSql.sql
但我仍然收到找不到文件的错误消息。
好吧,回答晚了一点,但我希望这对以后的人有所帮助。
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
将在环境重启之间更新
所以最后,如果我想添加新的初始化脚本,我只需要将新的 .sql
文件添加到 _init_scripts
文件夹并更新或创建新的 .env 文件。