Comment fournir une variable ENV de k8s à une application python pendant l'exécution du docker
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
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
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