postgres 部署中的环境变量不起作用
env vars in postgres deployment not working
首先,我很确定我知道为什么这不起作用:我正在拉取 Docker postgres:11-alpine
图像,对其进行修改,然后尝试更改 env:
在 k8s 中 deployment.yaml
在自定义图像上。我认为这是问题所在。
基本上,我正在尝试根据 Docker postgres
docs:
来完成此操作
docker run --name some-postgres -e POSTGRES_PASSWORD='foo' POSTGRES_USER='bar'
这是我的:
Dockerfile.dev
FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
postgres.yaml(我玩完了秘密会被转移)
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
env:
- name: POSTGRES_DB
value: "test_dev"
- name: POSTGRES_USER
value: "bar"
- name: POSTGRES_PASSWORD
value: "foo"
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
但是,当我使用 Skaffold 在本地启动集群时,env:
"don't take" 因为我仍然可以使用默认值 POSTGRES_USER=postgres
和 POSTGRES_PASSWORD=''
访问数据库.
我敢打赌,如果我做了 image: postgres
,那么 env:
会起作用,但是我不确定如何做与 Docker 文件中的等效的操作:
COPY ./db/*.sql /docker-entrypoint-initdb.d/
有什么建议吗?
这里是 skaffold.yaml
如果这也有帮助的话:
apiVersion: skaffold/v1beta15
kind: Config
build:
local:
push: false
artifacts:
- image: testproject/postgres
docker:
dockerfile: ./db/Dockerfile.dev
sync:
manual:
- src: "***/*.sql"
dest: .
- image: testproject/server
docker:
dockerfile: ./server/Dockerfile.dev
sync:
manual:
- src: "***/*.py"
dest: .
deploy:
kubectl:
manifests:
- k8s/ingress.yaml
- k8s/postgres.yaml
- k8s/server.yaml
Docker postgres docs 提及以下内容:
Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.
您确定要使用空数据目录开始部署吗?可能是 PostgreSQL 启动并允许您使用在您第一次使用该持久卷启动它时在环境变量中指定的凭据登录吗?
如果不是,请查看 运行 pod 的环境变量。 kubectl describe POD
应该告诉您哪些环境变量实际传递给了 pod。也许您的 Skaffold 设置中的某些内容覆盖了环境变量?当执行到 pod 时,您可以通过 运行 env
查看 pod。另外不要忘记日志,PostgreSQL 容器应该记录它在启动期间创建的用户帐户。
首先,我很确定我知道为什么这不起作用:我正在拉取 Docker postgres:11-alpine
图像,对其进行修改,然后尝试更改 env:
在 k8s 中 deployment.yaml
在自定义图像上。我认为这是问题所在。
基本上,我正在尝试根据 Docker postgres
docs:
docker run --name some-postgres -e POSTGRES_PASSWORD='foo' POSTGRES_USER='bar'
这是我的:
Dockerfile.dev
FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
postgres.yaml(我玩完了秘密会被转移)
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
env:
- name: POSTGRES_DB
value: "test_dev"
- name: POSTGRES_USER
value: "bar"
- name: POSTGRES_PASSWORD
value: "foo"
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
但是,当我使用 Skaffold 在本地启动集群时,env:
"don't take" 因为我仍然可以使用默认值 POSTGRES_USER=postgres
和 POSTGRES_PASSWORD=''
访问数据库.
我敢打赌,如果我做了 image: postgres
,那么 env:
会起作用,但是我不确定如何做与 Docker 文件中的等效的操作:
COPY ./db/*.sql /docker-entrypoint-initdb.d/
有什么建议吗?
这里是 skaffold.yaml
如果这也有帮助的话:
apiVersion: skaffold/v1beta15
kind: Config
build:
local:
push: false
artifacts:
- image: testproject/postgres
docker:
dockerfile: ./db/Dockerfile.dev
sync:
manual:
- src: "***/*.sql"
dest: .
- image: testproject/server
docker:
dockerfile: ./server/Dockerfile.dev
sync:
manual:
- src: "***/*.py"
dest: .
deploy:
kubectl:
manifests:
- k8s/ingress.yaml
- k8s/postgres.yaml
- k8s/server.yaml
Docker postgres docs 提及以下内容:
Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.
您确定要使用空数据目录开始部署吗?可能是 PostgreSQL 启动并允许您使用在您第一次使用该持久卷启动它时在环境变量中指定的凭据登录吗?
如果不是,请查看 运行 pod 的环境变量。 kubectl describe POD
应该告诉您哪些环境变量实际传递给了 pod。也许您的 Skaffold 设置中的某些内容覆盖了环境变量?当执行到 pod 时,您可以通过 运行 env
查看 pod。另外不要忘记日志,PostgreSQL 容器应该记录它在启动期间创建的用户帐户。