So stellen Sie während des Docker-Laufs eine ENV-Variable von k8s für eine Python-App bereit

Oct 14 2020

Ich habe eine Docker-Datei, in der ich die env-Variablen vorerst fest codiere, da sie während des Erstellungsprozesses in die App eingefügt werden. Jetzt möchte ich diese zur Laufzeit einfügen, wenn die Anwendung im k8s-Pod ausgeführt wird. Ich habe versucht , dies aber seine nicht funktioniert. Unten ist meine Docker-Datei. Ich benutze zum ersten Mal ernsthaftes Python und bin mir nicht sicher, wie ich es beheben soll.

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" ]

Antworten

avadhut007 Oct 14 2020 at 17:10

Erstellen Sie zuerst eine k8s-Konfigurationskarte oder ein k8s-Geheimnis (besser für vertrauliche Daten) in Ihrem Cluster. Lesen Sie diese Werte dann in k8s Deployment Yaml als Env-Variablen für Pod.

offizielle Dokumente: https://kubernetes.io/docs/concepts/configuration/secret/

Z.B. Erstelle geheime Yamswurzel

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

Bereitstellungs-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
Matt Oct 15 2020 at 11:09

Sie können env-Variablen mit dem Pod-Spezifikationsfeld an k8s pod übergeben : env.

Schauen Sie sich das folgende Beispiel aus k8s-Dokumenten an:

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"

Weitere Informationen finden Sie auch in der k8s-Dokumentation:

  • k8s api spec referenz
  • Umgebungsvariablen definieren
  • Verwenden von Geheimnissen als Umgebungsvariablen