docker-compose UnknownHostException:但是docker运行正常

时间:2019-01-11 19:24:25

标签: docker docker-compose

我有一个docker映像(lfs-service:latest),我试图将其作为一组微服务运行。

  • RHELS 7.5
  • Docker版本: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 DB 机器(不在Docker容器中)。

我的服务正常运行。太好了!


现在,我的问题是:

我正在尝试使用Docker Compose运行/管理我的服务,其中包含以下内容(为了简化该场景,我从docker-compose.yaml中删除了所有其他服务和我的api网关):

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”相同顶部的“运行”命令?

注意:我还尝试了dbhost的以下值:localhost,127.0.0.1-这将无法工作,因为它试图在容器中而不是在主机上查找数据库。

2 个答案:

答案 0 :(得分:0)

更正不幸的是,尽管此解决方案仅在最简单的用例中起作用-它将使Eureka&API网关无法正常运行,因为该容器将在单独的网络上运行。我仍在寻找有效的解决方案。

对于任何想解决这个问题的人来说,这对我有用:

docker-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:主机”

我不知道这是否是解决此问题的“正确”方法,但是由于它仅适用于我们的远程开发服务器,因此该解决方案对我有效。如果您有更好的解决方案,我欢迎您提出建议。

答案 1 :(得分:0)

工作解决方案

简单的解决方案是仅提供主机IP地址(相对于主机名)。

    environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=172.18.0.1

通过环境变量进行设置可能更便于移植:

export DB_HOST_IP=172.18.0.1

docker-compose.yaml

    environment:
            - SPRING_PROFILES_ACTIVE=dev
            - dbhost=${DB_HOST_IP}