Cómo configurar las properties de la database ORM de Hibernate para que funcionen con Docker

Para conectarme a la database utilizo un socket de networking, que se especifica dentro de mi hibernate.cfg.xml como:

 <property name="connection.url">jdbc:postgresql://localhost:PORT/DBNAME</property> 

junto con nombre de usuario, contraseña:

  <property name="connection.username">user</property> <property name="connection.password">pass</property> 

Quiero usar Docker para la implementación.

Mi problema es que actualmente tengo que cambiar el código fuente (por ejemplo, hibernate.cfg.xml) y reproducir un nuevo file .war cada vez que quiero volver a implementarlo.

Hay alguna manera de evitar esto? ¿Puedo usar el mismo file .war y vincular dinámicamente a una database desde Docker?

Supongo que podría tener un file de configuration (algo así como .env) que contuviera las cnetworkingenciales de db y que tanto java como docker lo lean, pero ahora no debo configurar Docker para que lo haga

Creo que tienes las siguientes opciones:

  • Use las properties del sistema en el XML como en <property name="connection.username">${db.user}</property>
  • Mantenga diferentes files hibernate.cfg.xml usando perfiles y filters maven para elegir el correcto para cada entorno
  • Usar configuration programática y properties del sistema o variables de entorno

El problema con las properties del sistema es que para usarlas tendrá que configurarlas en su server de aplicaciones, usar files de properties o pasarlas a través de la command-line, como en -Ddb.user=foo . Para configurarlos en el server de la aplicación, debe hacer que el contenedor use una CLI, REST API o quizás otro file de configuration (esta vez para el server) para configurarlo. Dependerá de lo que estés desplegando .war . Pasar esas properties a través de la línea de command tiene el problema de que las cnetworkingenciales de la database estén allí en text sin formatting para cualquiera que pueda listr ese process.

Mantener varios files de configuration o usar files de properties también es un problema y agrega una sobrecarga a su process de compilation que no creo que sea necesario, al less no para configurar cnetworkingenciales simples.

Creo que lo mejor es usar la configuration programática . Entonces, todo lo que tendría que hacer es establecer las variables de entorno correctas dentro del contenedor. En su aplicación, sería solo una cuestión de:

 Configuration cfg = new Configuration() .setProperty("connection.username", System.getenv("DB_USER")) // ...