通过Helm配置PostgreSQL:添加用户与数据库名环境变量
解决PostgreSQL初始化脚本的环境变量配置问题
步骤1:在Helm Values中定义变量
先在你的values.yaml里添加数据库名和用户名的配置项,方便后续自定义修改:
postgres: configmap: postgres-init-script # 保留你原有的ConfigMap名称 dbName: my-db # 自定义目标数据库名 user: my-user # 自定义需要授权的用户 # 保留你已有的其他PostgreSQL配置(镜像、密码Secret等)
步骤2:修改ConfigMap中的初始化脚本
把脚本里硬编码的数据库名和用户名替换成环境变量,同时增加默认值兜底,避免变量未注入时出错:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Values.postgres.configmap }} namespace: {{ .Release.Namespace }} data: init_script.sh: |+ #!/bin/bash # 从环境变量读取配置,未获取到则用默认值 DB_NAME=${DB_NAME:-"default-db"} DB_USER=${DB_USER:-"default-user"} # 执行初始化SQL,用双引号包裹标识符避免特殊字符解析问题 psql -v ON_ERROR_STOP=1 <<-EOSQL CREATE DATABASE "$DB_NAME"; GRANT ALL PRIVILEGES ON DATABASE "$DB_NAME" TO "$DB_USER"; # 这里可以继续添加其他模式、表的初始化语句 EOSQL
步骤3:在PostgreSQL部署资源中注入环境变量
不管你用的是Deployment还是StatefulSet,需要在容器配置里添加环境变量,把Values里的配置传递给容器,同时确保初始化脚本的Volume挂载正确:
apiVersion: apps/v1 kind: StatefulSet # 或者Deployment,根据你的实际部署类型调整 metadata: name: postgres namespace: {{ .Release.Namespace }} spec: template: spec: containers: - name: postgres image: {{ .Values.postgres.image }} env: # 保留PostgreSQL默认的超级用户配置(如果已有) - name: POSTGRES_USER value: {{ .Values.postgres.superUser | default "postgres" }} - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: {{ .Values.postgres.secret }} key: password # 注入自定义的数据库名和用户变量 - name: DB_NAME value: {{ .Values.postgres.dbName }} - name: DB_USER value: {{ .Values.postgres.user }} volumeMounts: # 挂载初始化脚本到PostgreSQL的默认初始化目录 - name: init-script mountPath: /docker-entrypoint-initdb.d/ readOnly: true volumes: - name: init-script configMap: name: {{ .Values.postgres.configmap }} defaultMode: 0755 # 必须设置脚本可执行权限
环境变量的使用方式
- 容器内连接psql:直接用环境变量指定参数,比如执行
psql -U $POSTGRES_USER -d $DB_NAME - 应用程序连接:在应用配置中读取
DB_NAME和DB_USER这两个环境变量,作为数据库连接的目标库和用户名参数
内容的提问来源于stack exchange,提问作者user20220951
相关产品推荐
相关产品推荐

