如何在 Kubernetes Pod 中执行 sql 脚本文件?

Dha*_*aya 4 sql-server kubernetes

我想使用 SQL 脚本文件在 Kubernetes pod 中创建 SQL Server 数据库。我有创建数据库并插入主数据的 SQL 脚本。由于我是 Kubernetes 新手,我很难在 Pod 中运行 SQL 脚本。我知道 SQL 脚本可以在单独的 kubectl exec 命令中手动执行,但我希望它在 pod 部署 yml 文件本身中自动执行。

有没有办法将脚本文件挂载到pod的卷中并在启动容器后运行它?

aci*_*uji 10

hooks对于这种情况,您可以使用 kubernetes 。其中有两个:PostStartPreStop

PostStart创建容器后立即执行。 PreStop另一方面,在容器终止之前立即调用。

您可以实现两种类型的挂钩处理程序:ExecHTTP

Exec- 在容器的 cgroup 和命名空间内执行特定命令,例如 pre-stop.sh。命令消耗的资源将根据容器进行计数。 HTTP- 针对容器上的特定端点执行 HTTP 请求。

PostStart是这里要使用的一个,但是请注意,该钩子与主进程并行运行。它不会等待主进程完全启动。在钩子完成之前,容器将保持等待状态。

您可以使用一些解决方法,并向sleep脚本添加一个命令,以便让它稍等一下主容器的创建。您的脚本文件可以存储在容器映像中,或使用 挂载到与 pod 共享的卷ConfigMap。以下是如何做到这一点的一些示例:

kind: ConfigMap
apiVersion: v1
metadata:
  namespace: <your-namespace> 
  name: poststarthook
data:
  poststart.sh: |
     #!/bin/bash
     echo "It`s done"
Run Code Online (Sandbox Code Playgroud)

确保您的脚本不超过1mb限制ConfigMap

定义后,configMap您将使用以下命令安装它volumes

spec:
      containers:
      - image: <your-image>
        name: example-container
        volumeMounts:
          - mountPath: /opt/poststart.sh
            subPath: poststart.sh
            name: hookvolume
      volumes:
      - name: hookvolume
        configMap:
          name: poststarthook
          defaultMode: 0755 #please remember to add proper (executable) permissions
Run Code Online (Sandbox Code Playgroud)

然后你可以postStart在你的规范中定义:

spec:
  containers:
  - name: example-container
    image: <your-image> 
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", /opt/poststart.sh ]
Run Code Online (Sandbox Code Playgroud)

您可以在 kubernetes文档本文中阅读有关钩子的更多信息。让我知道这是否有帮助。