英文:
How to use ENV vars in golang to pass DB connection values dynamically when deployed in kubernetes
问题
我目前正在开发一个使用golang编写的小型API,它将连接到一个SQL数据库。下面是我在代码中静态传递数据库连接字符串详细信息的片段(硬编码在代码中)。
const (
DB_USER = "username"
DB_PASSWORD = "password"
DB_NAME = "db_name"
DB_HOST = "db_server_name"
DB_PORT = db_port
)
现在,我想使用环境变量使这些静态硬编码的值变得动态,这样任何人都可以使用环境变量在运行时设置这些详细信息。有人可以帮助我如何实现这一点吗?如何从代码中设置它们,以便可以在k8的部署中动态传递为环境变量?
我的当前deployment.yaml文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-demo-app
spec:
replicas: 1
selector:
matchLabels:
app: go-demo-app
template:
metadata:
labels:
app: go-demo-app
spec:
containers:
- name: go-demo-app
image: dockerhub/go-api:latest
resources: {}
ports:
- containerPort: 8001
上述代码正常工作,因为数据库服务器名称在代码中是硬编码的,现在我希望通过代码动态地使用环境变量来传递它,这样我可以在k8的部署中引用它。
英文:
I am currently developing a small API in golang which will connect to a sql database. Below is the snip where I am passing the database connection string details statically ( hardcoded in the code ) .
const (
DB_USER = "username"
DB_PASSWORD = "password"
DB_NAME = "db_name"
DB_HOST = "db_server_name"
DB_PORT = db_port )
Now I want to use ENV variables to make this static hardcoded values to become dynamic, so anyone on the fly can set these details using ENV vars. Can someone help me how I can achieve this. How to set them in such way from code so it can be dynamically passed as ENV vars in k8's deployment ?
My current deployment.yaml file as below
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-demo-app
spec:
replicas: 1
selector:
matchLabels:
app: go-demo-app
template:
metadata:
labels:
app: go-demo-app
spec:
containers:
- name: go-demo-app
image: dockerhub/go-api:latest
resources: {}
ports:
- containerPort: 8001
The above is working fine as the db server name is hardcoded in the code and now I can looking to pass it dynamically using ENV vars via code which I can refer in k8's deployment
答案1
得分: 2
将.yaml文件更改为
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-demo-app
spec:
replicas: 1
selector:
matchLabels:
app: go-demo-app
template:
metadata:
labels:
app: go-demo-app
spec:
containers:
- name: go-demo-app
image: dockerhub/go-api:latest
resources: {}
ports:
- containerPort: 8001
env:
- name: DB_USER
value: 用户名
- name: DB_PASSWORD
value: 密码
- name: DB_NAME
value: 数据库名称
- name: DB_HOST
value: 数据库服务器名称
- name: DB_PORT
value: "3306"
kubectl apply -f /path/to/file
在你的代码中,将初始化更改为
var (
DB_USER = os.Getenv("DB_USER")
DB_PASSWORD = os.Getenv("DB_PASSWORD")
DB_NAME = os.Getenv("DB_NAME")
DB_HOST = os.Getenv("DB_HOST")
DB_PORT = os.Getenv("DB_PORT")
)
我将const更改为var,因为不允许使用const。
英文:
Change the .yaml to
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-demo-app
spec:
replicas: 1
selector:
matchLabels:
app: go-demo-app
template:
metadata:
labels:
app: go-demo-app
spec:
containers:
- name: go-demo-app
image: dockerhub/go-api:latest
resources: {}
ports:
- containerPort: 8001
env:
- name: DB_USER
value: username
- name: DB_PASSWORD
value: password
- name: DB_NAME
value: db_name
- name: DB_HOST
value: db_server_name
- name: DB_PORT
value: "3306"
kubectl apply -f /path/to/file
on your code, change the initialization into
var (
DB_USER = os.Getenv("DB_USER")
DB_PASSWORD = os.Getenv("DB_PASSWORD")
DB_NAME = os.Getenv("DB_NAME")
DB_HOST = os.Getenv("DB_HOST")
DB_PORT = os.Getenv("DB_PORT")
)
I change const to var because it is not allowed
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论