美文网首页
阿里云 Docker Swarm集群,部署的时候给Java传递参

阿里云 Docker Swarm集群,部署的时候给Java传递参

作者: Yellowtail | 来源:发表于2019-03-15 16:10 被阅读0次

    概述

    我们现在遇到了这么一个问题,同一份代码需要部署到两个容器里,
    一个用来提供接口
    一个用来消费消息队列里的消息(这个应用其实也提供了接口,只是我们在部署的时候不会暴露它的端口,无法访问)
    我们现在的想法是希望通过某种方法,传递一个参数,Java程序在运行的时候,可以得到这个变量
    根据不同的值,去干不同的事情

    可能的方法

    为了达到这个目的,我们也尝试了很多方案

    1. 打包时,选择不同的配置文件
      这个方案通过设置配置文件里的一个变量来达到这个目的
      但是如果以后配置文件有变更,得同步修改好几个地方,有点麻烦

    2. 构建不同的Docker镜像
      由于我们的容器是通过阿里云的 Swarm集群部署的,我们修改不了 docker run -e 命令

    3. 修改tomcat配置
      我们的应用是非常古老的Spring MVC项目,用的是tomcat这个容器
      虽然可以通过修改 tomcat启动脚本来设置变量,但是还是存在和方案1一样的问题,如果以后修改了这个启动脚本
      还是需要重复修改

    适合我们的方案

    最后在查看我们其他应用的部署配置时,得到了启发
    可以在阿里云的编排配置里,设置变量,最后在Java代码里也可以取得到

    阿里云编排配置

    b-async-task-dev-default:
      image: 'registry.cn-shenzhen.aliyuncs.com/xxxxxxx/b-xxxxxxx-dev:latest'
      mem_limit: 0
      environment:
        - container_type=async_task
      kernel_memory: 0
      memswap_reservation: 0
      restart: always
      shm_size: 0
      memswap_limit: 0
      cpu_shares: 25
      labels:
        aliyun.scale: '1'
    

    注意上面的 environment,配置了一个 container_type
    然后是 Java代码(我是用spring boot测试的)

    @SpringBootApplication
    public class DemoApplication {
        
        private static final Logger LOGGER = LoggerFactory.getLogger(DemoApplication.class);
    
        public static void main(String[] args) {
            
            Map<String, String> m = System.getenv();
            
            m.forEach( (k, v) -> {
                LOGGER.info("key {}, value {}", k, v);
            });
        
            LOGGER.info("--------------------------------------" );
        
             Properties p = System.getProperties();
             
             p.keySet().forEach( k -> {
                 String v = (String) p.get(k);
                 
                 LOGGER.info("key {}, value {}", k, v);
             });
        
            SpringApplication.run(DemoApplication.class, args);
        
            }
    }
    

    可以看到日志


    log

    写在后面

    这个方法适合我们,但是不一定适合大家,大家可以参考借鉴一下

    相关文章

      网友评论

          本文标题:阿里云 Docker Swarm集群,部署的时候给Java传递参

          本文链接:https://www.haomeiwen.com/subject/auqrmqtx.html