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?
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: .