我正在努力在我的应用程序的deployment.yaml
中添加一个init-container
,这样我就可以解耦我的postgres数据库引导或模式进化。
作为V1,我试图挂载一个sql文件,该文件将包括从本地目录引导db(数据库,模式,用户),然后通过使用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
从我的搜索结果中,我猜我必须使用空dir卷类型来挂载文件,但我现在无法让它工作。
我还需要通过db凭据,但不确定如何从sql脚本内的环境变量中使用它们,是否有任何语法?
你能帮我把这些点联系起来吗?主要是如何将文件挂载到init容器中,以及如何从shell脚本中获取env变量,并在sql脚本中使用它们来创建例如带有密码的用户?
提前感谢。
您必须做以下事情:
-
将SQL文件的内容作为ConfigMap,例如:
apiVersion: v1 kind: ConfigMap metadata: name: mariadb-config data: mariadb-schema: "DROP DATABASE IF EXISTS test;nnCREATE 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
那么您的init容器命令将像:
['sh', '-c', 'psql -a -f /var/db/config/mariadb-config.sql']
对于你的第二个问题,制作一个shell脚本来读取env变量(db凭据-我假设你在秘密中拥有它们并将它们用作env变量),然后调用这个命令:
psql -a -f /var/db/config/mariadb-config.sql
因此,为了实现这一点,该脚本的内容应该在配置映射中,并从卷挂载执行脚本,就像上面的示例一样。
希望对你有帮助。