【问题标题】:SQL script isn't running Kubernetes, but runs fine using just DockerSQL 脚本未运行 Kubernetes,但仅使用 Docker 即可正常运行
【发布时间】:2019-12-06 08:01:07
【问题描述】:

有一个很简单的test.sql:

SELECT 'CREATE DATABASE test_dev'
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'test_dev')\gexec

\c test_dev

CREATE TABLE IF NOT EXISTS test_table (
  username varchar(255)
);

INSERT INTO test_table(username)
VALUES ('test name');

执行以下操作符合我的预期:

Dockerfile.dev

FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
docker build -t testproj/postgres -f db/Dockerfile.dev .
docker run -p 5432:5432 testproj/postgres

这会创建数据库,切换到它,创建一个表,然后插入值。

现在我正在尝试在 Kubernetes 中使用 Skaffold 做同样的事情,但似乎什么都没有发生:没有错误消息,但在 postgres 中没有任何变化

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: init-script
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-storage
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: postgres
  template:
    metadata:
      labels:
        component: postgres
    spec:
      volumes:
        - name: postgres-storage
          persistentVolumeClaim:
            claimName: postgres-storage
        - name: init-script
          persistentVolumeClaim:
            claimName: init-script
      containers:
        - name: postgres
          image: postgres
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgres-storage
              mountPath: /var/lib/postgresql/data
              subPath: postgres
            - name: init-script
              mountPath: /docker-entrypoint-initdb.d
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: postgres
  ports:
    - port: 5432
      targetPort: 5432

我在这里做错了什么?

基本上试图遵循这里的答案,但没有成功。听起来我需要将 .sql 移动到持久音量。

https://stackoverflow.com/a/53069399/3123109

【问题讨论】:

    标签: postgresql docker kubernetes


    【解决方案1】:

    您不想在入口点文件夹上安装卷。您基本上是用一个空文件夹来掩盖图像中的脚本。此外,您没有使用修改后的图像,因此一开始就没有您的脚本。

    【讨论】:

      【解决方案2】:

      我不能 100% 确定您的映像是否可以在 Kubernetes 上运行。

      我建议使用像PostgreSQL chart by bitnami 这样经过测试的东西,阅读Using Kubernetes to Deploy PostgreSQL 可能会有所帮助。

      如果您想在 Kubernetes 中使用自己的镜像,您需要将镜像推送到您的私有 Docker 注册表或存储库。这在Pull an Image from a Private Registry进行了解释。

      至于test.sql可以存入ConfigMap

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: test-sql
      data:
        test.sql: |
          SELECT 'CREATE DATABASE test_dev'
          WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'test_dev')\gexec
          \c test_dev
          CREATE TABLE IF NOT EXISTS test_table (
            username varchar(255)
          );
          INSERT INTO test_table(username)
          VALUES ('test name');
      

      您可以稍后挂载为 init.sql 或在创建 pod 后执行。

      【讨论】:

        【解决方案3】:

        coderanger 指出了一个明显的错误,让我朝着正确的方向前进:我指的不是修改后的图像。

        我相应更新:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: postgres-deployment
        spec:
          replicas: 1
          selector:
            matchLabels:
              component: postgres
          template:
            metadata:
              labels:
                component: postgres
            spec:
              containers:
                - name: postgres
                  image: testproject/postgres
                  ports:
                    - containerPort: 5432
                  volumeMounts:
                    - name: postgres-storage
                      mountPath: /var/lib/postgresql/data
                      subPath: postgres
              volumes:
                - name: postgres-storage
                  persistentVolumeClaim:
                    claimName: postgres-storage
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: postgres-cluster-ip-service
        spec:
          type: ClusterIP
          selector:
            component: postgres
          ports:
            - port: 5432
              targetPort: 5432
        

        然后它开始相应地加载数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-03
          • 2015-05-15
          • 2016-10-24
          • 2018-05-06
          • 2020-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多