2017-06-27 12 views
2

Ich habe eine Java Spring Boot App, die mit einer Postgres-Datenbank funktioniert. Ich möchte Docker für beide verwenden. Ich habe zunächst nur das Postgres in Docker, und ich hatte eine docker-compose.yml Datei wie folgt definiert:Docker Compose + Spring Boot + Postgres Verbindung

version: '2' 
services: 
    db: 
     container_name: sample_db 
     image: postgres:9.5 
     volumes: 
      - sample_db:/var/lib/postgresql/data 
     environment: 
      - POSTGRES_PASSWORD=sample 
      - POSTGRES_USER=sample 
      - POSTGRES_DB=sample 
      - PGDATA=/var/lib/postgresql/data/pgdata 
     ports: 
      - 5432:5432 

volumes: 
    sample_db: {} 

Dann, als ich die Befehle ausgegeben sudo dockerd und sudo docker-compose -f docker-compose.yml up, es begann die Datenbank. Ich könnte zum Beispiel unter Verwendung pgAdmin verbinden, indem Sie localhost als Server und Port 5432 verwenden. Dann habe ich in meiner Spring Boot App innerhalb der Datei application.properties die folgenden Eigenschaften definiert.

An diesem Punkt konnte ich meine Spring Boot App lokal durch Spring Suite laufen lassen, und alles lief gut. Dann wollte ich auch meine Spring Boot App als Docker Image hinzufügen. Ich zunächst einmal erstellt ein Dockerfile in meinem Projektverzeichnis, das wie folgt aussieht:

FROM java:8 
EXPOSE 8080 
ADD /target/manager.jar manager.jar 
ENTRYPOINT ["java","-jar","manager.jar"] 

Dann habe ich in das Verzeichnis des Projekts eingegeben mvn clean von mvn install gefolgt ausgegeben. Als nächstes ausgegeben docker build -f Dockerfile -t manager . gefolgt von docker tag 9c6b1e3f1d5e myuser/manager:latest (die ID ist korrekt). Schließlich bearbeitete ich meine vorhandenen docker-compose.yml Datei wie folgt aussehen:

version: '2' 
services: 
    web: 
     image: myuser/manager:latest 
     ports: 
      - 8080:8080 
     depends_on: 
      - db 
    db: 
     container_name: sample_db 
     image: postgres:9.5 
     volumes: 
      - sample_db:/var/lib/postgresql/data 
     environment: 
      - POSTGRES_PASSWORD=sample 
      - POSTGRES_USER=sample 
      - POSTGRES_DB=sample 
      - PGDATA=/var/lib/postgresql/data/pgdata 
     ports: 
      - 5432:5432 

volumes: 
    sample_db: {} 

Aber jetzt, wenn ich sudo docker-compose -f docker-compose.yml up Befehl ausgeben, wieder die Datenbank korrekt gestartet wird, aber ich bekomme Fehler und Exit-Code 1 für die Web-App Teil. Das Problem ist die Verbindungszeichenfolge. Ich glaube, ich muss es zu etwas anderem ändern, aber ich weiß nicht, was es sein sollte. Ich bekomme folgende Fehlermeldung:

web_1 | 2017-06-27 22:11:54.418 ERROR 1 --- [   main] o.a.tomcat.jdbc.pool.ConnectionPool  : Unable to create initial connections of pool. 
web_1 | 
web_1 | org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections 

Irgendwelche Ideen?

Antwort

8

Jeder Container hat seine eigene Netzwerkschnittstelle mit einem eigenen localhost. So ändern, wie Java Punkte auf Postgres:

spring.datasource.url=jdbc:postgresql://localhost:5432/sample 

An:

spring.datasource.url=jdbc:postgresql://db:5432/sample 

db wird auf die richtige Postgres IP lösen.


Bonus. Mit docker-compose müssen Sie Ihr Bild nicht von Hand erstellen. So ändern:

web: 
    image: myuser/manager:latest 

An:

web: 
    build: . 
+0

Danke, es funktioniert gut. – typos

+0

Gern geschehen! – Robert

Verwandte Themen