Docker Compose + Spring Boot + Postgres соединение, приводящее к ошибке - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть приложение Java Spring Boot, которое работает с базой данных Postgres. Я хочу использовать Docker для них обоих. Сначала я создал файл docker-compose.yml, как показано ниже:

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

Затем в моем приложении Spring Boot в файле application.properties я определил следующие свойства.

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

вместе с этим я создал Dockerfile в каталоге моего проекта, который выглядит следующим образом:

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"]

Я выполнил эти команды и в результате получил ошибку, приведенную ниже

Чистая упаковка mvn

docker-compose up

Проблема в строке подключения. Я считаю, что должен изменить это на что-то другое, но я не знаю, что это должно быть. Я получаю следующие сообщения об ошибках:

 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

Я новичок в докере, если у вас возникли проблемы, пожалуйста, сообщите

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Это было из-за " ", данного по ошибке.Я изменил его на

version: '3'
services:
  db:
    restart: always
    image: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=employee
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password

  web:
    build: .
    ports:
      - 8080:8080

Теперь он работает нормально.Спасибо за ваше драгоценное время.

0 голосов
/ 16 ноября 2018

Имя вашей службы db, это то, что вам нужно будет указывать в качестве имени хоста из вашего веб-контейнера. Имя контейнера sample_db не может быть разрешено из веб-контейнера, поскольку вы не указали сеть и, следовательно, используете мостовую сеть по умолчанию.

Согласно документации, мостовая сеть по умолчанию не обеспечивает разрешение имен между контейнерами, только IP. Используя docker compose, вы сможете решить, используя имя службы.

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

Ссылка также должна работать вместо определения собственной настраиваемой мостовой сети:

  web:
    build: .
    expose:
      - "8080"
    depends_on:
      - db
    links:
      - "db:sample_db"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...