web-dev-qa-db-fra.com

Docker Compose + Spring Boot + connexion Postgres

J'ai une Java Spring Boot app qui fonctionne avec une base de données Postgres. Je veux utiliser Docker pour les deux. Au départ, je n'ai mis que Postgres dans Docker, et j'avais un docker-compose.yml fichier défini comme ceci:

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: {}

Ensuite, lorsque j'ai lancé les commandes Sudo dockerd et Sudo docker-compose -f docker-compose.yml up, il démarrait la base de données. Je pourrais me connecter en utilisant pgAdmin par exemple, en utilisant localhost comme serveur et port 5432. Ensuite, dans mon application Spring Boot, à l'intérieur du application.properties fichier J'ai défini les propriétés suivantes.

spring.datasource.url=jdbc:postgresql://localhost:5432/sample
spring.datasource.username=sample
spring.datasource.password=sample
spring.jpa.generate-ddl=true

À ce stade, je pouvais exécuter mon application Spring Boot localement via Spring Suite, et tout fonctionnait bien. Ensuite, je voulais également ajouter mon application Spring Boot en tant qu'image Docker. J'ai tout d'abord créé un Dockerfile dans mon répertoire de projet, qui ressemble à ceci:

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

Ensuite, je suis entré dans le répertoire du projet émis mvn clean suivi par mvn install. Ensuite, publié docker build -f Dockerfile -t manager . suivi par docker tag 9c6b1e3f1d5e myuser/manager:latest (l'id est correct). Enfin, j'ai modifié mon docker-compose.yml fichier pour ressembler à ceci:

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: {}

Mais maintenant, si j'émets Sudo docker-compose -f docker-compose.yml up commande, la base de données redémarre correctement, mais j'obtiens des erreurs et quitte le code 1 pour la partie d'application Web. Le problème est la chaîne de connexion. Je crois que je dois le changer pour autre chose, mais je ne sais pas ce que cela devrait être. Je reçois les messages d'erreur suivants:

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

Des idées?

11
typos

Chaque conteneur possède sa propre interface réseau avec son propre hôte local. Modifiez donc comment Java pointe vers Postgres:

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

À:

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

db se résoudra en IP Postgres appropriée.


Prime. Avec docker-compose, vous n'avez pas besoin de créer votre image à la main. Alors changez:

web:
  image: myuser/manager:latest

À:

web:
  build: .
18
Robert