La forma en que lo hacemos es que tenemos 3 piezas (o artefactos) para cada aplicación en ejecución.
- La aplicación que estamos desarrollando. Esto es lo mismo independientemente del entorno. Para que coincida con su ejemplo, esa será la aplicación Spring como jar / war.
- El contenedor que ejecutará la aplicación. Esto es lo mismo independientemente del entorno. Si usa Spring Boot, ya no necesita Tomcat y solo el tiempo de ejecución de Java. Entonces use el contenedor openjdk Docker.
- La configuración que necesita la aplicación. Esto es lo único que es diferente en todos los entornos. En una aplicación Spring, es probable que estés usando un archivo de propiedades.
El archivo de configuración vive en un control de origen separado. Esto solía ser Git, pero ahora estamos usando un SaaS que creamos llamado Config, en http://www.configapp.com . La característica principal de Config es el manejo sencillo de la configuración específica del entorno. Para ejecutar nuestra aplicación en un nuevo servidor, extraemos el contenedor Docker, el artefacto de la aplicación y el archivo de configuración para ese entorno. En el contenedor, montamos el directorio donde se almacena la aplicación y el archivo de configuración, como parte de la ejecución del contenedor. Nuestra aplicación es la misma. Nuestro contenedor / imagen es el mismo. Solo el archivo de configuración es diferente.
En cuanto al archivo de configuración vs variables de entorno. Durante mucho tiempo estuvimos usando archivos de configuración. Cuando usamos PaaS / cloud, utilizamos variables de entorno. Fue un trabajo extra si tienes mucha configuración, así que terminamos usando variables de entorno para determinar el archivo de configuración correcto. Tenemos una aplicación que convirtió las propiedades en variables de entorno, pero eso es atípico. Si tenemos un servidor de configuración centralizado autorizado por la compañía, lo usamos, de lo contrario nos gusta la simplicidad de los archivos de configuración.
Para resumir, extraemos app.jar, app.properties, openjdk Docker. Luego ejecutamos openjdk Docker montando la ubicación de app.jar y app.properties. Lo único específico del entorno es app.properties. Para administrar fácilmente las propiedades de las aplicaciones, independientemente de cuántas claves de propiedad, entornos, instancias de clúster / región, utilizamos Config.