代码之家  ›  专栏  ›  技术社区  ›  MikeBFromPDX

docker撰写未知的nhostexception:但docker运行有效

  •  0
  • MikeBFromPDX  · 技术社区  · 7 年前

    我有一个Docker图像(LFS服务:最新),我正试图作为一套微服务的一部分运行。

    • 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映像的容器 九千
    • 将上载到磁盘写入lfs uploads目录
    • 并连接到主机上运行的本地Postgres数据库 机器(不在码头集装箱内)。

    我的服务按预期工作。伟大的!


    现在,我的问题是:

    我正在使用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 run”命令功能相同的可编译docker compose文件有什么想法吗?

    注意:我还为db host尝试了以下值:localhost,127.0.0.1-这不起作用,因为它尝试在容器中而不是在主机上查找db。

    2 回复  |  直到 7 年前
        1
  •  0
  •   MikeBFromPDX    7 年前

    更正: 不幸的是,虽然此解决方案在最简单的用例中工作,但它将中断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”
    • 添加“网络模式:主机”

    我不知道这是否是解决这一问题的“正确”方法,但因为它只适用于我们的远程开发服务器,所以该解决方案正在为我工作。如果你有更好的解决方案,我愿意接受建议。

        2
  •  0
  •   MikeBFromPDX    7 年前

    工作方案

    简单的解决方案是只提供主机IP地址(vs hostname)。

        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}