Docker 실행 중에 k8s의 ENV 변수를 Python 앱에 제공하는 방법

Oct 14 2020

빌드 프로세스 중에 앱에 삽입되므로 지금은 env 변수를 하드 코딩하는 도커 파일이 있습니다. 이제 응용 프로그램이 k8s 포드에서 실행될 때 런타임 중에 이러한 항목을 삽입하고 싶습니다. 나는 노력 이 있지만 작동하지 않습니다. 아래는 내 도커 파일입니다. 진지한 파이썬을 처음 사용하고 그것을 고치는 방법을 모르겠습니다.

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

답변

avadhut007 Oct 14 2020 at 17:10

먼저 클러스터에서 k8s configmap 또는 k8s 비밀 (민감한 데이터에 더 적합)을 만듭니다. 그런 다음 k8s 배포 yaml에서 이러한 값을 포드의 환경 변수로 읽습니다.

공식 문서 : 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
Matt Oct 15 2020 at 11:09

pod spec field :를 사용하여 env 변수를 k8s pod에 전달할 수 있습니다 env.

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"

자세한 내용은 k8s 문서를 참조하십시오.

  • k8s API 사양 참조
  • 환경 변수 정의
  • 비밀을 환경 변수로 사용