【问题标题】:How to get docker ip and port in spring boot bootstrap.yml file如何在 spring boot bootstrap.yml 文件中获取 docker ip 和端口
【发布时间】:2019-05-02 08:45:22
【问题描述】:

我正在尝试在 consul 中为我的微服务应用程序配置运行状况检查,该应用程序将在 docker 容器中运行。

为了将执行器健康检查配置为 consul,我尝试使用 ${server.address} 作为主机地址,但它给了我 docker 容器 ID。

这是 bootstrap.yml

spring:
  cloud:
    consul:
      scheme: http
      host: consul.service.consul
      port: 8500
      config:
        format: YAML
        prefix: apps
        data-key: config
        default-context: ${spring.application.name}
      discovery:
        health-check-path: /actuator/health
        healthCheckInterval: 20s
        scheme: http
        enabled: true
        address: ${server.address}
  main:
    allow-bean-definition-overriding: true

在本地没有 docker 时,它能够正确解析地址,但在远程使用 docker 时,它会返回容器 ID。

有什么建议吗?

【问题讨论】:

    标签: spring-boot docker docker-machine spring-boot-actuator spring-cloud-config


    【解决方案1】:

    在 Docker 容器中运行时可能会遇到的问题是,在尝试恢复 hostnameIP Address 时,您将获得内部 Docker hostname 和内部 IP Address

    我在类似问题中使用的解决方案是:

    • 在创建容器时注入 Docker Host 的主机名。
    • 在 Docker 主机中公开容器端口

    例如:

    • 设置属性从外部获取地址:

      discovery:
         health-check-path: /actuator/health
         healthCheckInterval: 20s
         scheme: http
         enabled: true
         address:${HOSTNAME:server.address}
      
    • 运行容器时,提供HOSTNAME 属性的值:

      docker run -e HOSTNAME=myhostname.mydomain.com -p 8500:8500 my_docker_image
      

    这样,任何从外部进行健康检查的人都可以访问您在服务中定义的端点。

    希望对你有帮助。

    【讨论】:

    • 我们实际上是在使用 marathon 来部署通过 Jenkins 管道构建的 docker 镜像。主机地址也会根据可用的服务器而改变。有没有其他方法可以动态获取运行地址并配置consul指向相同?
    • 我对 Marathon 不熟悉,但我想它会提供一些方法来自定义您的容器并提供该变量。根据您在容器中运行的 Spring Boot 服务,我无法知道它正在运行的 Dcoker 主机的主机名。
    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2018-02-01
    • 2016-11-07
    • 1970-01-01
    • 2018-07-10
    • 2015-07-30
    • 2018-08-09
    • 2018-11-22
    相关资源
    最近更新 更多