如何将 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 文件。