如何从 docker 命令行设置参数来配置 Spring Boot 应用程序?
Posted
技术标签:
【中文标题】如何从 docker 命令行设置参数来配置 Spring Boot 应用程序?【英文标题】:How can I set parameters from docker command line to configure spring boot application? 【发布时间】: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 命令行或更好的想法设置它?
【问题讨论】:
【参考方案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.properties
或 application.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】:
从我的角度来看,你基本上有几个选择:
-
从 docker 传入参数作为环境变量,例如通过使用以下方式启动应用程序:
docker run -e SPRING_CONFIG_URI="http://xxx.xxx.xx.73:8888 user/image:tag"
使用相同的主机名并使用容器链接,方法是为您的第一个容器命名为docker run --name configserver my/configserver:latest
,然后启动您的服务,然后使用链接docker run --link configserver:configserver my/service:latest
。需要注意的是,您将被绑定到同一个 docker 主机。
始终使用相同的主机名和端口,并在容器启动时注入正确的主机名映射,例如在您的应用程序中配置http://configserver:8888
并使用docker run --add-host configserver:xxx.xxx.xx.73 user/image:tag
启动容器
通过docker run --dns=your-dns-server user/image:tag
向正在运行的容器注入一个可以充当DNS服务器的自定义服务,并将您的依赖服务注册到可以具有动态配置的dns服务器中,例如consul或SkyDNS+etcd。
而最后一种方法的好处是您可以跨节点将容器动态链接到托管 docker 容器的节点。
【讨论】:
以上是关于如何从 docker 命令行设置参数来配置 Spring Boot 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章