如何从 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.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】:

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

    从 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 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

2021-09-28 docker 配置JVM参数及常用命令使用

如何使用Docker实现PHP命令行程序的CI/CD?

VS2008中命令行参数如何设置读入多个文件

PM2用法简介命令行启动 --env 参数设置使用问题

Docker 拉取镜像失败处理

Docker CMD(命令)和 ARGS(参数)使用整理