首页 > 解决方案 > 如何在 docker run 期间将来自 k8s 的 ENV 变量提供给 python 应用程序

问题描述

我有一个 docker 文件,我现在在其中对 env 变量进行硬编码,因为它在构建过程中被注入到应用程序中。现在,我想在应用程序在 k8s pod 中运行时在运行时注入它们。我试过这个,但它不工作。下面是我的码头文件。这是我第一次使用严重的 python 并且不知道如何修复它。

FROM python:3.7-slim AS build

WORKDIR /app

COPY . .

RUN python3 setup.py bdist_wheel

#ENV USE_DB="True" \
#   DB_USERNAME= \
#   DB_HOST= \
#   DB_PASSWORD= \
#   DB_DB=sth
RUN pip3 install dist/app_search*.whl && \
    semanticsearch-preprocess

FROM python:3.7-slim

WORKDIR /opt/srv

COPY --from=build /app/dist/app_search*.whl /opt/srv/

COPY --from=build /tmp/projects* /opt/srv/

# set environment variables to /opt/srv
ENV DICT_FILE="/opt/srv/projects.dict" \
    MODEL_FILE="/opt/srv/projects.model.cpickle" \
    INDEX_FILE="/opt/srv/projects.index" \
    EXTERNAL_INDEX_FILE="/opt/srv/projects.mm.metadata.cpickle"


RUN pip3 install waitress && \
    pip3 install app_search*.whl

EXPOSE 5000

ENTRYPOINT [ "waitress-serve" ]

CMD [ "--call", "app_search.app:main" ]

标签: pythondockerkubernetes

解决方案


首先在集群中创建 k8s configmap 或 k8s secret(更适合敏感数据)。然后在 k8s 部署 yaml 中读取这些值作为 pod 的 env 变量。

官方文档:https ://kubernetes.io/docs/concepts/configuration/secret/

例如。创建秘密 yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
    username: "abc-user"
    password: "pwd-here"

部署 yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: DB_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: DB_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

推荐阅读