【问题标题】:How can you read a database port from application.properties with environment variables如何使用环境变量从 application.properties 读取数据库端口
【发布时间】:2019-11-17 18:29:03
【问题描述】:

我对 Spring Boot 和 application.properties 非常陌生。我有一个问题,我需要非常灵活地使用我的数据库端口,因为我有两个不同的数据库。因此我想从环境变量中读取端口。我尝试了以下方法:

spring.data.mongodb.uri = mongodb://project1:${db-password}@abc:12345/project

如果我的数据库具有端口 12345,则此代码可以正常工作。但是如果我现在尝试从环境变量中读取端口,则会出现问题。 我试过这个:

spring.data.mongodb.uri = mongodb://project1:${db-password}@abc:${port}/project

问题如下:我使用的是 k8 和 Jenkins。环境变量“port”在我的 k8 中提供给我的程序,这对“db-password”有效,但不适用于端口。我的詹金斯说: "连接字符串包含无效的主机 'abd:${port}'。端口 '${port}' 无效,它必须是 0 到 65535 之间的整数"

现在我的问题是: 如何将端口读取为环境变量,而不会出现此错误?

提前谢谢你!

【问题讨论】:

  • 执行到shell,首先确认有你要找的环境变量。
  • 您只能使用环境提供的变量。因为db_password 有效,我们可以假设它已提供。根据@oleg-butuzov,如果您可以进入容器,则可以枚举所有环境变量(env)并查看是否设置了${port}。凭直觉(猜测),如果${db_password} 有效,您是否尝试过 ${db_port}`?
  • 您是否查看了此链接:Define environment variable container
  • 是的,已经这样做了,环境变量已设置,我检查了它
  • 如果存在ENV['port'],请检查您的代码,例如$port}(这是您的示例)。

标签: jenkins kubernetes environment-variables port environment


【解决方案1】:

要将环境变量注入 pod,您可以执行以下操作:

配置图

您可以创建 ConfigMap 并配置您的 pod 以使用它。

所需步骤:

  • 创建ConfigMap
  • 使用 ConfigMap 更新/创建部署
  • 测试一下

创建配置映射

我在下面提供了简单的ConfigMap 来存储您的变量:

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-config
data:
  port: "12345"

要应用它并能够使用它,请调用以下命令:

$ kubectl create -f example-configmap.yaml

上面的ConfigMap 将创建环境变量port,其值为12345

检查ConfigMap是否创建成功:

$ kubectl get configmap

输出应该是这样的:

NAME             DATA   AGE
example-config   1      21m

要获取详细信息,您可以使用命令查看:

$ kubectl describe configmap example-config

有输出:

Name:         example-config
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
port:
----
12345
Events:  <none>

使用 ConfigMap 更新/创建部署

我提供了简单的部署,包括ConfigMap

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        envFrom:
          - configMapRef:
              name: example-config
        ports:
        - containerPort: 80

负责使用ConfigMap的配置:

        envFrom:
          - configMapRef:
              name: example-config

之后,您需要使用以下命令运行部署:

$ kubectl create -f configmap-test.yaml

并检查它是否正常工作:

$ kubectl get pods

有输出:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-84d6f58895-b4zvz   1/1     Running   0          23m
nginx-deployment-84d6f58895-dp4c7   1/1     Running   0          23m

测试一下

要测试环境变量是否正常工作,您需要进入 pod 并自行检查。

为此调用命令:

$ kubectl exec -it NAME_OF_POD -- /bin/bash

请为变量 NAME_OF_POD 提供适合您情况的变量。

成功进入容器后运行:

$ echo $port

它应该显示:

root@nginx-deployment-84d6f58895-b4zvz:/# echo $port
12345

现在您可以在 pod 中使用环境变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 2017-11-16
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2017-03-06
    • 2016-11-15
    • 2015-05-18
    相关资源
    最近更新 更多