如何从docker命令行设置参数以配置spring boot应用程序?

时间:2015-09-15 13:31:20

标签: java spring docker spring-boot

我的弹簧启动应用程序带有yml,可以在docker containter中配置它。 这样的事情:

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

正如你所看到的,我的配置中有一个ip硬编码,这是一个坏主意,因为编译仅适用于服务器。 是否存在外部化ip的方法,或者从docker命令行或更好的想法设置它?

2 个答案:

答案 0 :(得分:5)

有很多不同的方法可以做到:

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

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还会读取config/application.propertiesapplication.properties中与可执行JAR文件位于同一目录中的值,因此可以提供此文件(您可以使用)对此VOLUME并覆盖JAR中的设置

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

答案 1 :(得分:1)

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

  1. 将params作为来自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. 启动容器
  5. 通过docker run --dns=your-dns-server user/image:tag向正在运行的容器注入可作为DNS服务器的自定义服务,并在具有动态配置的dns服务器中注册您的相关服务,例如consul或{{3} } + SkyDNS
  6. 尽管最后一种方法的好处是可以将容器动态链接到托管泊坞容器的交叉节点。