【问题标题】:How can I set parameters from docker command line to configure spring boot application?如何从 docker 命令行设置参数来配置 Spring Boot 应用程序?
【发布时间】:2015-12-11 18:58:41
【问题描述】:

我有一个带有 yml 的 Spring Boot 应用程序,可以在 Docker 容器中对其进行配置。 类似的东西:

 spring:   application:
   name: micro-example
   config:
     uri: ${vcap.services.config-service.credentials.uri:http://xxx.xxx.xx.73:8888}

如您所见,我的配置中有一个硬编码的 ip,这是一个坏主意,因为编译只是针对服务器的。 是否存在将 ip 外部化的方法,或者从 docker 命令行或更好的想法设置它?

【问题讨论】:

    标签: java spring docker spring-boot


    【解决方案1】:

    有很多不同的方法来做到这一点:

    1) 设置环境变量(在shell中使用export VCAP_SERVICES_CONFIG-SERVICE_CREDENTIALS_URI='http://example.com',或者在Dockerfile中使用ENV

    2) 将其作为 JVM 参数传递 (java -Dvcap.services.config-service.credentials.uri=http://example.com -jar app.jar)

    3) 将其作为命令行参数传递 (java -jar app.jar --vcap.services.config-service.credentials.uri=http://example.com)

    4) Spring Boot 还从与可执行 JAR 文件位于同一目录中的 config/application.propertiesapplication.properties 读取值,因此可以提供此文件(您可以为此使用 VOLUME)并覆盖来自 JAR 的设置

    另请参阅:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

    【讨论】:

    • 虽然您可以覆盖 docker 选项 2 中的某些内容,但并不可取,因为它要求您在启动 docker 容器时可以操作入口点。如果只需要传递几个选项(比如这里的配置服务器的 url),选项 1 和 3 就很好,而选项 3 需要 Dockerfile 的特定结构。如果您想覆盖很多设置但还需要更改 Spring Boot 的默认值,选项 4 很好。我个人更喜欢带有配置服务器和 git 设置的 3。
    • 谢谢,我会试试你的建议
    • 选项#3 仍然有效吗?我正在努力让它工作
    【解决方案2】:

    从我的角度来看,你基本上有几个选择:

    1. 从 docker 传入参数作为环境变量,例如通过使用以下方式启动应用程序:docker run -e SPRING_CONFIG_URI="http://xxx.xxx.xx.73:8888 user/image:tag"
    2. 使用相同的主机名并使用容器链接,方法是为您的第一个容器命名为docker run --name configserver my/configserver:latest,然后启动您的服务,然后使用链接docker run --link configserver:configserver my/service:latest。需要注意的是,您将被绑定到同一个 docker 主机。
    3. 始终使用相同的主机名和端口,并在容器启动时注入正确的主机名映射,例如在您的应用程序中配置http://configserver:8888 并使用docker run --add-host configserver:xxx.xxx.xx.73 user/image:tag 启动容器
    4. 通过docker run --dns=your-dns-server user/image:tag向正在运行的容器注入一个可以充当DNS服务器的自定义服务,并将您的依赖服务注册到可以具有动态配置的dns服务器中,例如consulSkyDNS+etcd

    而最后一种方法的好处是您可以跨节点将容器动态链接到托管 docker 容器的节点。

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 2020-12-13
      • 2018-11-28
      • 2020-02-26
      相关资源
      最近更新 更多