如何在 Init 容器中挂载 sql 文件以引导 Postgres 数据库

问题描述 投票:0回答:2

我正在努力在我的应用程序的

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脚本中使用它们来创建例如带有密码的用户?

提前致谢。

postgresql shell kubernetes configmap
2个回答
1
投票

您必须执行以下操作:

  1. 将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;
    
  2. 在部署 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

因此,为了实现这一点,该脚本的内容应该位于配置映射中,并从卷安装中执行脚本,就像上面的示例一样。

希望这有帮助。


0
投票

正在研究类似的东西,发现了以下方法(

11.5.24
)(
postgres:16.2
docker图像和
kubernetes v1.31
):

  1. 我有一个现有的 SQL 初始化文件
    init.sql
  2. 我运行
    kubectl create configmap initsql --from-file=init.sql
    生成一个
    configMap
    文件。我将文件重命名为
    postgres-init.yaml
  3. kubectl apply -f postgres-init.yaml
    .
  4. 我有标准票价
    postgres-deployment.yaml
    - 基本上是从官方示例复制而来,并进行了一些修改。
  5. volumes
    中,我添加了:
    volumes:
      - ...
      - name: sql-init-mount
        configMap:
          name: initsql
          items:
           - key: init.sql
             path: init.sql
    
  6. 在同一个
    postgres-deployment.yaml
    中,我添加到
    postgres container
    本身:
    volumeMounts:
      - mountPath: /docker-entrypoint-initdb.d
        name: sql-init-mount
    
  7. 官方
    postgres
    Docker 镜像支持自动初始化放入
    docker-entrypoint-initdb.d
    的任何脚本。

我怀疑使用

configMap
可以在不使用
containerInit
或任何
commands
的情况下完成同样的事情。事实证明我是对的,您可能需要稍等片刻,但如果您:

  1. minikube dashboard
    可以找到已部署的
    postgres pod
    ,您可以轻松地
    exec
    (如果您在本地执行此操作)验证文件是否存在(创建更正)并运行:
    psql -U postgres -d postgres
    登录并查询.
© www.soinside.com 2019 - 2024. All rights reserved.