Пользователь и база данных не инициализируются через переменные среды при развертывании postgres в kubernetes - PullRequest
0 голосов
/ 15 апреля 2020

Когда я пытаюсь развернуть postgres поверх kubernetes, я заполнил все необходимые переменные среды, такие как POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE и т. Д. c. через создание configmap и секретных файлов. Контейнер успешно развернут, и я могу открыть его через терминал с помощью команды «kubectl exe c». Когда я запускаю команду 'env', видно, что все переменные среды, предоставленные во время развертывания, успешно установлены соответствующим образом. Но когда я пытаюсь запустить:

psql -U testuser -d testdb

Это дает два типа ошибок:

psql : не удалось подключиться к серверу: FATAL: роль 'testuser' не существует

psql: не удалось подключиться к серверу: FATAL: база данных 'testdb' не существует

После выполнения Много исследований, я обнаружил, что даже после установки переменных среды, пользователь и база данных не инициализируются. Поэтому я создал файл init. sql и добавил его в docker -entrypoint-initdb.d для создания собственного образа, вставил sh в docker концентратор и развернул postgres через этот образ в kubernetes. .

init. sql содержимое файла:

CREATE USER testuser WITH SUPERUSER PASSWORD test;

CREATE DATABASE testdb;

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

Содержание файла Docker:

FROM postgres:latest

ADD init.sql /docker-entrypoint-initdb.d/

EXPOSE 5432

Тем не менее, я получаю ту же ошибку. пользователь и база данных не инициализируются ... пожалуйста, помогите мне с этим

ОБНОВЛЕНИЕ :

Журналы:

PostgreSQL Database directory appears to contain a database; Skipping initialization

2020-04-15 09:50:06.855 UTC [1] LOG:  starting PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2020-04-15 09:50:06.855 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2020-04-15 09:50:06.855 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2020-04-15 09:50:07.000 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-04-15 09:50:07.204 UTC [26] LOG:  database system was interrupted; last known up at 2020-04-15 09:50:02 UTC
2020-04-15 09:50:07.781 UTC [26] LOG:  database system was not properly shut down; automatic recovery in progress
2020-04-15 09:50:07.815 UTC [26] LOG:  invalid record length at 0/16453B0: wanted 24, got 0
2020-04-15 09:50:07.815 UTC [26] LOG:  redo is not required
2020-04-15 09:50:08.034 UTC [1] LOG:  database system is ready to accept connections

Вот, это уже упоминалось «Пропуск инициализации»

1 Ответ

0 голосов
/ 15 апреля 2020

вы можете попробовать с этим сценарием оболочки? имя файла: init-user-db. sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

Docker файл как-то так

FROM postgres:latest

ADD init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

EXPOSE 5432

РЕДАКТИРОВАТЬ: 1

apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    spec:
      podManagementPolicy: OrderedReady
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: postgres
      serviceName: postgres
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: postgres
        spec:
          containers:
          - env:
            - name: POSTGRES_USER
              value: root
            - name: POSTGRES_PASSWORD
              value: <Password>
            - name: POSTGRES_DB
              value: <DB name>
            - name: PGDATA
              value: /var/lib/postgresql/data/pgdata
            image: postgres:9.5
            imagePullPolicy: IfNotPresent
            name: postgres
            ports:
            - containerPort: 5432
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres-data
              subPath: pgdata
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 60
      updateStrategy:
        rollingUpdate:
          partition: 0
        type: RollingUpdate
      volumeClaimTemplates:
      - metadata:
          creationTimestamp: null
          name: postgres-data
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 3Gi
          volumeMode: Filesystem
        status:
          phase: Pending
...