如何将 docker 中的 spring.datasource.data 作为完整路径传递?

这是我的 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

我想将完整的系统路径传递给像 /usr/tmp/someSql.sql 这样应该在服务器启动时执行的 sql 文件。我可以使用默认的 data.sql,但问题是我将有多个服务器,这些服务器将具有不同的初始/更新数据,所以我不想将包含业务数据的多个文件放入 jar 中,只是为了使其对 spring 启动和 docker 可见。

但即使这样,如果我将所有文件都放在资源文件夹中,并将它们放在 jar 中并使用 someData.sql 作为值,它在启动期间也看不到该文件。

出于显而易见的原因,我也不想为用户创建端点以插入他们自己的 sql。

我已经尝试过 file:/usr/tmp/someSql.sql 但我仍然收到无法找到文件的错误。

liuyf320 回答:如何将 docker 中的 spring.datasource.data 作为完整路径传递?

好的回答有点晚,但我希望这会在未来对某人有所帮助。

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

大家都在问