我正在努力在我的应用程序的
init-container
中添加 deployment.yaml
,以便我可以解耦我的 postgres 数据库引导程序或模式演化。
作为 V1,我尝试挂载一个 sql 文件,该文件将包括从本地目录引导数据库(数据库、架构、用户),然后使用 Postgres 客户端映像来运行脚本中的命令。
目前我有以下内容
initContainers:
- name: init-myservice
image: jbergknoff/postgresql-client
command: ['sh', '-c', 'psql -a -f /bootstrap.sql']
env:
- name: PGUSER
....
.....
volumeMounts:
- mountPath: /bootstrap.sql
name: bootstrap.sql
从我的搜索结果中,我猜测我必须使用空目录卷类型来安装文件,但目前我无法让它工作。
我还需要传递数据库凭据,但不确定如何从 sql 脚本内的环境变量使用它们,是否有任何语法?
你能帮忙把这些点连接起来吗?主要是如何将文件挂载到init容器中以及如何从shell脚本中获取env变量并在sql脚本中使用它们来创建例如带有密码的用户?
提前致谢。
您必须执行以下操作:
将SQL文件的内容做成这样的ConfigMap,例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: mariadb-config
data:
mariadb-schema: "DROP DATABASE IF EXISTS test;\n\nCREATE DATABASE IF NOT EXISTS test;
在部署 yaml 中从此配置映射创建一个卷,如下所示:
volumes:
- name: mariadb-schema-config-vol
configMap:
name: mariadb-config
defaultMode: 420
items:
- key: mariadb-schema
path: mariadb-schema.sql
像这样安装卷:
volumeMounts:
- mountPath: /var/db/config
name: mariadb-schema-config-vol
那么你的初始化容器命令将是这样的:
['sh', '-c', 'psql -a -f /var/db/config/mariadb-config.sql']
对于第二个问题,制作一个读取环境变量的 shell 脚本(数据库凭据 - 我假设您将它们秘密保存并将它们用作环境变量),然后调用此命令:
psql -a -f /var/db/config/mariadb-config.sql
因此,为了实现这一点,该脚本的内容应该位于配置映射中,并从卷安装中执行脚本,就像上面的示例一样。
希望这有帮助。
正在研究类似的东西,发现了以下方法(
11.5.24
)(postgres:16.2
docker图像和kubernetes v1.31
):
init.sql
。kubectl create configmap initsql --from-file=init.sql
生成一个 configMap
文件。我将文件重命名为 postgres-init.yaml
。kubectl apply -f postgres-init.yaml
.postgres-deployment.yaml
- 基本上是从官方示例复制而来,并进行了一些修改。volumes
中,我添加了:
volumes:
- ...
- name: sql-init-mount
configMap:
name: initsql
items:
- key: init.sql
path: init.sql
postgres-deployment.yaml
中,我添加到 postgres container
本身:
volumeMounts:
- mountPath: /docker-entrypoint-initdb.d
name: sql-init-mount
postgres
Docker 镜像支持自动初始化放入docker-entrypoint-initdb.d
的任何脚本。我怀疑使用
configMap
可以在不使用 containerInit
或任何 commands
的情况下完成同样的事情。事实证明我是对的,您可能需要稍等片刻,但如果您:
minikube dashboard
可以找到已部署的postgres pod
,您可以轻松地exec
(如果您在本地执行此操作)验证文件是否存在(创建更正)并运行:psql -U postgres -d postgres
登录并查询.