postgres 部署中的环境变量不起作用

soc*_*pet 0 docker kubernetes skaffold

首先,我很确定我知道为什么这不起作用:我正在拉取 Dockerpostgres:11-alpine映像,对其进行修改,然后尝试更改自定义映像上的env:k8s 中的内容。deployment.yaml我认为这就是问题所在。

postgres 基本上,我正在尝试根据 Docker文档来完成此任务:

docker run --name some-postgres -e POSTGRES_PASSWORD='foo' POSTGRES_USER='bar'
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

Dockerfile.dev

FROM postgres:11-alpine
EXPOSE 5432
COPY ./db/*.sql /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然而,当我使用 Skaffold 在本地启动集群时,env:“不要”,因为我仍然可以使用默认值POSTGRES_USER=postgresPOSTGRES_PASSWORD=''.

我敢打赌,如果我image: postgres这样做了env:,那么就会起作用,但是我不确定如何执行 Dockerfile 中的等效操作:

COPY ./db/*.sql /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

这是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
Run Code Online (Sandbox Code Playgroud)

小智 5

Docker postgres文档提到了以下内容:

警告:只有当您使用空数据目录启动容器时,Docker 特定变量才会生效;容器启动时任何预先存在的数据库都将保持不变。

您确定要使用空数据目录开始部署吗?PostgreSQL 是否会启动并允许您使用首次使用该持久卷启动它时在环境变量中指定的凭据登录?

如果不是这样,请查看正在运行的 pod 的环境变量。kubectl describe POD应该告诉您哪些环境变量实际上传递到了 pod。也许您的 Skaffold 设置中的某些内容会覆盖环境变量?您可以通过在执行到 pod 时运行来查看 pod 中的情况env。另外不要忘记日志,PostgreSQL 容器应该记录它在启动期间创建的用户帐户。