A maneira como fazemos isso é que temos 3 peças (ou artefatos) para cada aplicativo em execução.
- A aplicação que estamos desenvolvendo. É o mesmo, independentemente do ambiente. Para corresponder ao seu exemplo, esse será o aplicativo Spring como um jar / war.
- O contêiner que executará o aplicativo. É o mesmo, independentemente do ambiente. Se você estiver usando o Spring Boot, não precisará mais do Tomcat e apenas do Java Runtime. Portanto, use o contêiner openjdk Docker.
- A configuração que o aplicativo precisa. Essa é a única coisa diferente entre os ambientes. Em um aplicativo Spring, você provavelmente estará usando um arquivo de propriedades.
O arquivo de configuração vive em um controle de origem separado. Isso costumava ser o Git, mas agora estamos usando um SaaS que construímos chamado Config, em http://www.configapp.com . O principal recurso do Config é o fácil manuseio de configurações específicas do ambiente. Para executar nosso aplicativo em um novo servidor, puxamos o contêiner do Docker, o artefato do aplicativo e o arquivo de configuração para esse ambiente. No contêiner, montamos o diretório em que o aplicativo e o arquivo de configuração estão armazenados, como parte da execução do contêiner. Nossa aplicação é a mesma. Nosso contêiner / imagem é o mesmo. Somente o arquivo de configuração é diferente.
Em relação ao arquivo de configuração versus variáveis de ambiente. Durante muito tempo, estávamos usando arquivos de configuração. Quando usamos PaaS / cloud, usamos variáveis de ambiente. Foi um trabalho extra se você tiver muita configuração, por isso acabamos usando variáveis de ambiente para determinar o arquivo de configuração correto. Temos um aplicativo que transformou propriedades em variáveis de ambiente, mas isso é atípico. Se tivermos um servidor de configuração centralizado sancionado pela empresa, usaremos isso, caso contrário gostaremos da simplicidade dos arquivos de configuração.
Então, para resumir, puxamos app.jar, app.properties, openjdk Docker. Em seguida, rodamos o openjdk Docker montando o local de app.jar e app.properties. A única coisa específica do ambiente é app.properties. Para gerenciar facilmente app.properties, independentemente de quantas chaves de propriedade, ambientes, instâncias de cluster / região, usamos o Config.