Docker Compose + Spring Boot + conexión Postgres, lo que resulta en un error

Tengo una aplicación Java Spring Boot que funciona con una base de datos Postgres. Quiero usar Docker para los dos. Inicialmente, creé un docker-compose.ymlarchivo como se muestra a continuación:

version: '3'
services:
  db:
    container_name: sample_db
    image: postgres
    volumes:
      - sample_db:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB="employee"
      - POSTGRES_USER="user"
      - POSTGRES_PASSWORD="password"
      - PGDATA=/var/lib/postgresql/data/pgdata

  web:
    build: .
    expose:
      - "8080"
    depends_on:
      - db
volumes:
  sample_db: {}

Luego, en mi aplicación Spring Boot, dentro del archivo application.properties definí las siguientes propiedades.

spring.datasource.url=jdbc:postgresql://db:5432/employee
spring.datasource.username=user
spring.datasource.password=password

junto con esto, creé un Dockerfile en mi directorio de proyectos, que se ve así:

FROM openjdk:8-jdk-alpine
EXPOSE 8080    
ARG JAR_FILE=target/employee-0.0.1-SNAPSHOT.jar    
COPY ${JAR_FILE} employee-demo.jar    
ENTRYPOINT ["java","-jar","employee-demo.jar"]

Emití estos comandos y terminé en el error como se indica a continuación

paquete limpio mvn

docker-componer

El problema es la cadena de conexión. Creo que tengo que cambiarlo por otra cosa, pero no sé qué debería ser. Recibo los siguientes mensajes de error:

 Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
web_1  |    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.Driver.makeConnection(Driver.java:454) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.Driver.connect(Driver.java:256) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.2.0.jar!/:na]
web_1  |    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1  |    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1  |    at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.3.7.Final.jar!/:5.3.7.Final]
web_1  |    ... 44 common frames omitted
web_1  | Caused by: java.net.UnknownHostException: sample_db
web_1  |    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_181]
web_1  |    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
web_1  |    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
web_1  |    at org.postgresql.core.PGStream.<init>(PGStream.java:70) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:91) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192) ~[postgresql-42.2.5.jar!/:42.2.5]
web_1  |    ... 58 common frames omitted

Soy nuevo en Docker, si hay algún problema, informe

Respuesta 1

Su nombre de servicio es db, que es lo que necesitará hacer referencia como el nombre de host de su contenedor web. El nombre del contenedor, sample_dbno se puede resolver desde el contenedor web porque no ha especificado una red y, por lo tanto, está utilizando la red puente predeterminada.

Según los documentos, la red puente predeterminada no proporciona resolución de nombres entre contenedores, solo IP. Usando docker compose, deberías poder resolver usando el nombre del servicio.

https://docs.docker.com/network/bridge/

https://docs.docker.com/compose/networking/

version: '3'
services:
  db:
    container_name: sample_db
    image: postgres
    volumes:
      - sample_db:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB="employee"
      - POSTGRES_USER="user"
      - POSTGRES_PASSWORD="password"
      - PGDATA=/var/lib/postgresql/data/pgdata
    networks:
      - my_network
  web:
    build: .
    expose:
      - "8080"
    depends_on:
      - db
    networks:
      - my_network
volumes:
  sample_db: {}
networks:
  my_network:
    driver: bridge

Un enlace también debería funcionar en lugar de definir su propia red de puente personalizada:

  web:
    build: .
    expose:
      - "8080"
    depends_on:
      - db
    links:
      - "db:sample_db"
Respuesta: 2

Tenía el siguiente comando funcionando bien con OpenJDK mvn clean install Luego desinstalé OpenJDK e instalé Oracle JDK 8, y ahora cuando ejecuto mvn clean install El entorno JAVA_HOME ...

Cómo podría definir algunos esquemas y datos que se insertarán en db para la base de datos sql en el arranque de primavera También podría hacer esto para las bases de datos incrustadas Por ejemplo, estoy usando dos bases de datos y quiero ...

Soy novato en Spring & Hibernate, tratando de ejecutar proyectos que los ejecuten juntos. Después de muchos errores, arreglar las cosas funciona bien, pero cuando estoy ejecutando la clase principal todavía obtengo esa excepción ...

Estoy tratando de mantener cada palabra en este archivo en una matriz para poder aplicar mi propia implementación de lenguaje. Ya he aplicado la división, pero cuando pongo la cadena en las partes variables, ...