So stellen Sie während des Docker-Laufs eine ENV-Variable von k8s für eine Python-App bereit
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
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
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