docker-compose UnknownHostException: но запуск Docker работает - PullRequest
0 голосов
/ 11 января 2019

У меня есть образ докера (lfs-service: latest), который я пытаюсь запустить как часть набора микросервисов.

  • RHELS 7.5
  • Версия докера: 1.13.1
  • docker-compose версия 1.23.2
  • Postgres 11 (установлен на хост-машине RedHat)

Следующая команда работает именно так, как я хотел бы:

docker run -d \
    -p 9000:9000 \
    -v "$PWD/lfs-uploads:/lfs-uploads" \
    -e "SPRING_PROFILES_ACTIVE=dev" \
    -e dbhost=$HOSTNAME \
    --name lfs-service \
    [corp registry]/lfs-service:latest

Это успешно:

  • создает / запускает контейнер с моим образом Spring Boot Docker на порту 9000
  • записывает загрузки на диск в каталог lfs-uploads
  • и подключается к локальной базе данных Postgres, работающей на хосте машина (не в контейнере Docker).

Мой сервис работает как положено. Отлично!

<ч /> Теперь моя проблема:

Я пытаюсь запускать / управлять моими службами с помощью Docker Compose со следующим содержимым (я удалил все другие службы и мой API-шлюз из docker-compose.yaml, чтобы упростить сценарий):

version: '3'
services:
    lfs-service:
        image: [corp registry]/lfs-service:latest
        container_name: lfs-service
        stop_signal: SIGINT
        ports:
            - 9000:9000
        expose:
            - 9000
        volumes:
            - "./lfs-uploads:/lfs-uploads"
        environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=$HOSTNAME  

Соответствующие записи в application.yaml:

spring:
    profiles: dev
    datasource:
        url: jdbc:postgresql://${dbhost}:5432/lfsdb
        username: [dbusername]
        password: [dbpassword]
    jpa:
        properties:
            hibernate:
                dialect: org.hibernate.dialect.PostgreSQLDialect
        hibernate:
            ddl-auto: update   

Исполнение:

docker-compose up  

...
The following profiles are active: dev
...
Tomcat initialized with port(s): 9000 (http)
...
lfs-service    | Caused by: java.net.UnknownHostException: [host machine hostname]
lfs-service    |        at 
java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_181]
lfs-service    |        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
lfs-service    |        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
lfs-service    |        at org.postgresql.core.PGStream.<init>(PGStream.java:70) ~[postgresql-42.2.5.jar!/:42.2.5]
lfs-service    |        at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:91) ~[postgresql-42.2.5.jar!/:42.2.5]
lfs-service    |        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192) ~[postgresql-42.2.5.jar!/:42.2.5]
...
lfs-service    | 2019-01-11 18:46:54.495  WARN [lfs-service,,,] 1 --- [           main] o.s.b.a.orm.jpa.DatabaseLookup           : Unable to determine jdbc url from datasource
lfs-service    |
lfs-service    | org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is org.postgresql.util.PSQLException: The connection attempt failed.
lfs-service    |        at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:328) ~[spring-jdbc-5.1.2.RELEASE.jar!/:5.1.2.RELEASE]
lfs-service    |        at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:356) ~[spring-jdbc-5.1.2.RELEASE.jar!/:5.1.2.RELEASE]
...

Оба метода запуска должны быть эквивалентными, но, очевидно, есть функциональное различие ... Любые идеи о том, как решить эту проблему / написать совместимый файл docker-compose, который функционально идентичен "Docker run" "команда наверху?

ПРИМЕЧАНИЕ: я также попробовал следующие значения для dbhost: localhost, 127.0.0.1 - это не будет работать, так как он пытается найти БД в контейнере, а не на хост-компьютере.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Рабочий раствор

Простое решение состоит в том, чтобы просто предоставить IP-адрес хост-машины (против имени хоста).

    environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=172.18.0.1

Установка этого параметра через переменную окружения, вероятно, будет более переносимой:

export DB_HOST_IP=172.18.0.1

докер-compose.yaml

    environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=${DB_HOST_IP}
0 голосов
/ 11 января 2019

ИСПРАВЛЕНИЕ: К сожалению, хотя это решение работает в простейшем случае - оно нарушит работу шлюзов Eureka & API, так как контейнер будет работать в отдельной сети. Я все еще ищу рабочее решение.

Для тех, кто ищет решение этого вопроса, у меня получилось:

докер-compose.yaml:

lfs-service:
    image: [corp repo]/lfs-service:latest
    container_name: lfs-service
    stop_signal: SIGINT
    ports:
        - 9000:9000
    expose:
        - 9000
    volumes:
        - "./lfs-uploads:/lfs-uploads"
    environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=localhost  
    network_mode: host

Сводка изменений, внесенных в docker-compose.yaml:

  • изменить $ HOSTNAME на "localhost"
  • Добавить "network_mode: host"

Я понятия не имею, является ли это «правильным» способом решения этой проблемы, но, поскольку это только для нашего удаленного сервера разработки, решение работает для меня. Я открыт для предложений, если у вас есть лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...