python - 如何在 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" ]
解决方案
首先在集群中创建 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
推荐阅读
- github - 无法从 Grails 应用程序中的 Github Api 获取数据
- email - 如何仅使用 id 创建新记录
- r - 如何将 i 索引值传递给 R 中的命令?
- java - 为什么我的 2048 风格的游戏在 128 之后就停止工作了?
- swift - 无法将“Published<[StepsEntity]>.Publisher”类型的值转换为预期的参数类型“Binding”
' - apache-kafka - psringboot 应用程序中的 KafkaProducer 事务
- python - Python循环导入,不能在两个文件之间导入函数?
- javascript - 处理逗号语句的javascript美化器
- dataframe - 在 Julia 中使用“if...else”创建字典?
- javascript - 如何加载一次日志文件,然后在 JavaScript 中附加新日志?