普通Java工程如何在代码中引用docker-compose.yml中的environment值

一、概述

普通Java工程这里指非spring工程,主要指一些系统资源监控程序、数据日志清理程序等,需要保持依赖简单,执行文件体积微小方便部署,这些程序需要需要跟数据库交互,例如需要将监控数据持久化到db、连接数据库清理过期数据等。

二、常规做法

1. 数据库配置分离

普通Java工程配置文件一般采用properties,典型的配置文件如下:
jdbc.properties

jdbc.driver   = com.mysql.cj.jdbc.Driver
jdbc.url      = jdbc:mysql://127.0.0.1:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true
jdbc.username = root
jdbc.password = root123

2. 代码引用配置

        ResourceBundle config = ResourceBundle.getBundle("jdbc");
        PoolProperties p = new PoolProperties();
        p.setUrl(config.getString("jdbc.url"));
        p.setDriverClassName(config.getString("jdbc.driver"));
        p.setUsername(config.getString("jdbc.username"));
        p.setPassword(config.getString("jdbc.password"));

3. 编写启动类

启动类main方法,一般使用定时任务线程池,以保证程序一直运行
核心代码:

 ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);
  service.scheduleAtFixedRate(() -> {
    
       doSomething(); // 业务方法
   }, 0, 60, TimeUnit.SECONDS);

4. 支持打包成可执行包

具体参考 普通Java工程可执行JAR两种打包方式探讨

5. 支持可执行包打包成docker镜像

具体参考: 容器镜像生成记

6. docker运行

在编排文件目录执行 docker-compose up -d

docker-compose.yml

version: '3.7'
services:
  java-with-docker:
    image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1
    container_name: java-with-docker
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 64M
        reservations:
          cpus: '0.05'
          memory: 64M
    restart: on-failure
    logging:
      driver: json-file
      options:
        max-size: '5m'
        max-file: '1'

三、存在问题分析

上面的做法存在最大的问题是:

  1. 数据库配置固定在内部配置文件jdbc.properties中
  2. 维护麻烦,如果是通用的需要,每换一套环境,需要重新跑流程,包括打包可执行包和镜像打包。

四、改进措施

springboot 工程中,我们支持数据源配置在docker-compose.yml中的environment配置
典型例子如下:

version: '3.8'
services:
  springboot-dbutils:
    image: 00fly/springboot-dbutils:0.0.1
    container_name: springboot-dbutils
    deploy:
      resources:
        limits:
          cpus: '0.80'
          memory: 400M
        reservations:
          cpus: '0.05'
          memory: 200M
    ports:
    - 80:8080
    environment:
    - SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:3306/dbutils?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
    - SPRING_DATASOURCE_USERNAME=user
    - SPRING_DATASOURCE_PASSWORD=password123
    restart: on-failure
    logging:
      driver: json-file
      options:
        max-size: 5m
        max-file: '1'

同理,我们也希望普通java也支持如下编排文件中的environment 变量

1. 包含environment 变量的编排文件

docker-compose.yml

version: '3.7'
services:
  java-with-docker:
    image: registry.cn-shanghai.aliyuncs.com/00fly/java-with-docker:0.0.1
    container_name: java-with-docker
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 64M
        reservations:
          cpus: '0.05'
          memory: 64M
    restart: on-failure
    environment:
    - JDBC_URL=jdbc:mysql://192.168.15.202:3306/jdbc?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
    - JDBC_USERNAME=test
    - JDBC_PASSWORD=test123
    - JDBC_DRIVER=com.mysql.cj.jdbc.Driver
    logging:
      driver: json-file
      options:
        max-size: '5m'
        max-file: '1'

2. 修改读取配置文件方式

将原来读取jdbc.properties的配置文件的方式修改为如下:

        //docker环境下优先使用docker-compose中environment值
        Map<String, String> env = System.getenv();
        ResourceBundle config = ResourceBundle.getBundle<
### 启动多个 Docker Compose 文件的方法 为了按照指定顺序启动两个不同的 `docker-compose` 配置文件(即先启动 `docker-compose-middle.yml`,再启动 `docker-compose.yml`),可以通过 `-f` 参数显式指定要使用的配置文件。以下是具体实现方法: #### 使用 `-f` 参数依次启动 Docker Compose 支持通过 `-f` 参数指定自定义的 `docker-compose` 文件路径。因此,可以分别调用两次 `docker-compose up` 命令来按顺序启动这两个文件。 ```bash # 先启动 docker-compose-middle.yml docker-compose -f docker-compose-middle.yml up -d # 再启动 docker-compose.yml docker-compose -f docker-compose.yml up -d ``` 以上命令中: - `-f` 参数指定了具体的 `docker-compose` 文件。 - `up -d` 表示以后台模式启动服务[^1]。 #### 组合多个文件一起加载 如果希望更简洁的方式一次性管理多个文件,也可以将多个 `docker-compose` 文件组合在一起加载。例如: ```bash docker-compose -f docker-compose-middle.yml -f docker-compose.yml up -d ``` 这种方式会将两个文件的内容合并,并按照依赖关系自动调整启动顺序[^3]。 需要注意的是,如果有重复的服务名称,则后面的文件中的配置会覆盖前面文件中的同名服务配置[^2]。 --- ### 注意事项 1. **确保文件格式一致** 两个文件都应遵循相同的 Compose 版本规范(如 V3)。如果不一致可能会导致解析错误[^4]。 2. **检查服务间的依赖关系** 如果某些服务存在依赖关系,需确认这些依赖已在第一个文件 (`docker-compose-middle.yml`) 中正确初始化后再启动第二个文件中的服务[^3]。 3. **日志监控** 可以通过以下命令查看所有已启动容器的日志输出: ```bash docker-compose -f docker-compose-middle.yml -f docker-compose.yml logs -f ``` --- ### 示例代码块 假设我们有如下两个简单的 `docker-compose` 文件: #### `docker-compose-middle.yml` ```yaml version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example ``` #### `docker-compose.yml` ```yaml version: '3' services: app: image: nginx:latest depends_on: - db ``` 启动流程如下: ```bash docker-compose -f docker-compose-middle.yml up -d docker-compose -f docker-compose.yml up -d ``` 或者直接组合启动: ```bash docker-compose -f docker-compose-middle.yml -f docker-compose.yml up -d ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值