gpt4 book ai didi

database - 在 kubernetes 中部署 postgres 时,用户和数据库未通过环境变量初始化

转载 作者:行者123 更新时间:2023-12-05 06:18:37 24 4
gpt4 key购买 nike

当我尝试在 kubernetes 上部署 postgres 时,我通过创建 configmap 和 secret 文件填充了所有必需的环境变量,例如 POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DATABASE 等。容器已成功部署,我可以通过“kubectl exec”命令打开其终端。当我运行“env”命令时,可以看到部署期间提供的所有环境变量都已相应地成功设置。但是当我尝试运行时:

psql -U testuser -d testdb

它给出了两种类型的错误:

psql: 无法连接到服务器:致命:角色 'testuser' 不存在

psql: 无法连接到服务器:致命:数据库 'testdb' 不存在

经过大量研究,我发现即使设置了环境变量,用户和数据库也没有初始化。因此,我创建了一个 init.sql 文件并将其添加到 docker-entrypoint-initdb.d 以构建自定义镜像,将其推送到 docker hub 并通过该镜像在 kubernetes 中部署 postgres。

init.sql文件内容:

CREATE USER testuser WITH SUPERUSER PASSWORD test;

CREATE DATABASE testdb;

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

Dockerfile 内容:

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

这里已经提到'Skipping initialization'

最佳答案

你能试试这个 shell 脚本吗?文件名: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

关于database - 在 kubernetes 中部署 postgres 时,用户和数据库未通过环境变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61223363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com