Comment fournir une variable ENV de k8s à une application python pendant l'exécution du docker

Oct 14 2020

J'ai un fichier docker dans lequel je codifie en dur les variables env pour le moment, car il est injecté dans l'application pendant le processus de construction. Maintenant, je veux les injecter pendant l'exécution lorsque l'application est exécutée dans le pod k8s. J'ai essayé cela mais ça ne marche pas. Voici mon fichier docker. C'est la première fois que j'utilise un python sérieux et je ne sais pas comment le réparer.

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

Réponses

avadhut007 Oct 14 2020 at 17:10

Créez d'abord k8s configmap ou k8s secret (mieux pour les données sensibles) dans votre cluster. Ensuite, lisez ces valeurs dans le déploiement de k8s yaml en tant que variables d'environnement pour pod.

Documents officiels: https://kubernetes.io/docs/concepts/configuration/secret/

Par exemple. Créer un yaml secret

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

Déploiement 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

Vous pouvez passer des variables env à K8S pod avec champ spec pod: env.

Regardez l'exemple suivant de la documentation k8s:

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"

Jetez également un œil à la documentation k8s pour plus d'informations:

  • référence des spécifications de l'API k8s
  • définition des variables d'environnement
  • utilisation de secrets comme variables d'environnement