2016-04-06 17 views
2

Um die Verbindung zur Datenbank arbeiten ich eine Netzwerkbuchse verwenden, die in meinem angegeben hibernate.cfg.xml als:Wie Hibernate ORM Datenbankeigenschaften zu konfigurieren, um mit Docker

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

zusammen mit Benutzername, Passwort:

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

Ich möchte Docker für die Bereitstellung verwenden.

Mein Problem ist, dass ich derzeit den Quellcode (z. B. Hibernate.cfg.xml) ändern muss, und reproduzieren eine neue WAR-Datei jedes Mal, wenn ich neu bereitstellen möchte.

Gibt es eine Möglichkeit, dies zu vermeiden? Kann ich die gleiche WAR-Datei verwenden und eine dynamische Verknüpfung zu einer Datenbank über Docker herstellen?

Ich glaube, ich könnte eine Konfigurationsdatei haben (so etwas wie .env), das die db-Anmeldeinformationen enthalten würde und haben sowohl Java und Docker dies lesen, aber ich jetzt nicht Docker so zu konfigurieren,

+0

Was verwenden Sie für einen Java EE-Server? –

+0

mein Stack ist Hibernate, Postgresql, Tomcat, Nginx (als Reverse-Proxy für Tomcat) – chefarov

+0

Hauptsächlich mein Problem war, dass Docker -env-Datei am Docker Run unterstützt, aber nicht am Docker Build, aber ich landete Env-Variablen in Dockerfile mit ENV-Befehl (nicht die beste Vorgehensweise). Wenn ich dies mit andrepnhs Antwort kombiniere, kann ich dieses Problem lösen. – chefarov

Antwort

2

ich zu tun glauben Sie folgende Möglichkeiten haben:

  • verwenden Systemeigenschaften im XML als in <property name="connection.username">${db.user}</property>
  • pflegen verschiedene hibernate.cfg.xml Dateien mit maven Profile und Filter die richtige für jede Umgebung holen
  • Verwenden programmatische Konfiguration und Systemeigenschaften oder Umgebungsvariablen

Das Problem mit Systemeigenschaften ist, dass sie nutzen Sie sie in Ihrem App-Server eingerichtet haben, verwenden Eigenschaften von Dateien oder sie über die Befehlszeile übergeben, wie in -Ddb.user=foo. Um sie auf dem Anwendungsserver einzurichten, müssen Sie den Container dazu veranlassen, eine CLI, eine REST-API oder eine andere Konfigurationsdatei (diesmal für den Server) zu verwenden. Es hängt davon ab, wofür Sie Ihre .war bereitstellen. Wenn Sie diese Eigenschaften über die Befehlszeile übergeben, tritt das Problem auf, dass die Datenbankanmeldeinformationen für jeden, der diesen Prozess auflisten kann, im Nur-Text-Format vorhanden sind.

Die Verwaltung mehrerer Konfigurationsdateien oder die Verwendung von Eigenschaftendateien ist ebenfalls ein Problem und fügt Ihrem Buildprozess einen Overhead hinzu, der meiner Meinung nach nicht notwendig ist, zumindest keine einfachen Anmeldeinformationen einzurichten.

Ich glaube, dass Sie am besten programmatic configuration verwenden. Dann müssen Sie nur die richtigen Umgebungsvariablen im Container festlegen. In Ihrer Anwendung wäre es nur eine Frage von:

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

Es hat funktioniert, danke – chefarov

Verwandte Themen