docker -- k8s - 터미널 터미널 과 일반 프로그램 및 jupyter notebook - 영구적 인 정적 환경 변 수 를 만 듭 니 다 -- 동적 환경 변 수 를 만 듭 니 다.

터미널 터미널 과 일반 프로그램
Liux 시스템 의 경우 주로 두 가지 시스템 환경 을 사용 하 는 경우 가 있 습 니 다. 하 나 는 사용자 로그 인 입 니 다. 예 를 들 어 bash 나 sh 등 명령 행 에 들 어가 셸 인터페이스 를 조작 하 는 것 입 니 다. 하 나 는 사용자 가 로그 인하 지 않 고 프로그램 이 자동 으로 실 행 됩 니 다.
두 가지 상황 에 따라 영구적 인 환경 변 수 를 만 드 는 방식 이 달라 진다.
영구적 인 정적 환경 변 수 를 만 듭 니 다.
정적 환경 변 수 는 내용 이 변 하지 않 고 고정된 값 을 말한다.
이 경우 환경 변 수 는 Dockerfile 종 에서 ENV 로 직접 지정 하면 됩 니 다.
예 를 들 면:
ENV JAVA_HOME=/spark/java/jre1.8.0_181  JRE_HOME=/spark/java/jre1.8.0_181  CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin:/usr/local/python37/bin
ENV PYSPARK_PYTHON  python3
ENV PYSPARK_DRIVER_PYTHON   python3

영구적 인 동적 환경 변 수 를 만 듭 니 다.
한 가지 사용 장면 은 우리 가 이 미 러 가 시작 되 기 전에 환경 변수의 값 을 모 르 는 것 이다. 미 러 가 시작 되 어야 이 환경 변수의 값 이 무엇 인지 알 수 있다. 이런 상황 을 우 리 는 동적 환경 변수 라 고 부른다.
예 를 들 어 ${HOSTNAME} 또는 K U B E R N E T E S E R V I C E H O S T, {KUBERNETES SERVICE HOST}, KUBERNETESS ERVICEH OST, {KUBERNETES SERVICE PORT} 등 몇 가지 변 수 는 미 러 가 시 작 된 후에 해당 pod 종 에 있어 야 이 몇 가지 변 수 를 가 질 수 있 습 니 다.
해결 방법 은 Dockerfile 의 입구 endpoint. sh 에서 환경 변 수 를 다시 실행 하 는 것 입 니 다.
endpoint. sh 는 모든 미 러 가 시작 되면 실행 되 는 스 크 립 트 이기 때문에 미 러 가 시작 되 었 기 때문에 관련 환경 변 수 를 얻 을 수 있 습 니 다.
Dockerfile 의 끝 에 사용 할 코드 는 다음 과 같 습 니 다.
ENV     MY_HOME /usr/local/zzq
COPY   entrypoint.sh ${MY_HOME}/entrypoint.sh
WORKDIR     ${MY_HOME}
ENTRYPOINT  ["./entrypoint.sh"]

entry point. sh 코드 는 다음 과 같 습 니 다.
echo 'export PYSPARK_SUBMIT_ARGS="--master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}   --deploy-mode client   pyspark-shell" '  >> /etc/profile.d/spark.sh


echo  'export PATH=/usr/local/python37/bin:$PATH' >> /etc/profile.d/airflow.sh

echo  'ln -sf  /usr/bin/python  /usr/bin/python3' >> /etc/profile.d/airflow.sh

echo  'export PATH=$PATH:$AIRFLOW_HOME' >> /etc/profile.d/airflow.sh

source /etc/profile


echo "hail env:"
echo $PYSPARK_SUBMIT_ARGS

python3 -V

whereis  python

echo $PATH

echo "env:"

env 

echo "spark conf:"

cat $SPARK_HOME/conf/spark-defaults.conf



스 크 립 트 디 렉 터 리/etc/profile. d/에 환경 변 수 를 주입 합 니 다.
/etc/profile 은 전역 환경 변 수 를 담당 하 며 터미널 과 일반적인 프로그램 실행 을 포함 하여 환경 변 수 를 불 러 옵 니 다.
/etc/profile 은 두 가지 용법 이 있 습 니 다. 하 나 는 export 문 구 를/etc/profile 파일 에 직접 추가 하 는 것 입 니 다. 하 나 는 sh 텍스트 파일 을/etc/profile. d/디 렉 터 리 에 추가 한 다음 source/etc/profile 환경 변 수 를 실행 하면 다음 로그 인 에 도 적 용 됩 니 다.
환경 변 수 를 관리 하 는 몇 가지 파일 차이
~/.bashrc
이 파일 은 사용자 전용 bash 셸 의 bash 정 보 를 포함 하고 있 으 며, bash 셸 에 로그 인 할 때 와 bash 를 열 때마다 실 행 됩 니 다.
사용 방식
    

vim ~/.bashrc

       

export PATH=$PATH:/.../...    

     


source ~/.bashrc

/etc/bashrc
bash 셸 을 실행 하 는 모든 사용자 에 게 이 파일 을 실행 합 니 다.bash 셸 이 열 렸 을 때 이 파일 은 읽 혔 습 니 다.
~/.bash_profile
모든 사용 자 는 이 파일 을 사용 하여 자신의 셸 정 보 를 입력 할 수 있 습 니 다. 사용자 가 bash 셸 로 로그 인 할 때 이 파일 은 한 번 만 실 행 됩 니 다. 기본 적 인 상황 에서 설정 한 환경 변 수 는 사용자 의 'bashrc 파일' 을 실행 합 니 다.
~/.profile
Debian 에서 bash 대신. profile 사용profile 파일.
~/.bash_logout
bash 셸 을 종료 할 때마다 이 파일 을 실행 합 니 다.
/etc/profile
이 파일 은 시스템 의 모든 사용자 에 게 환경 정 보 를 설정 합 니 다. 사용자 가 처음 로그 인 할 때 (셸 로그 인 이 든 프로그램 이 실행 되 든) 이 파일 은 실 행 됩 니 다.상기 몇 가지 파일 은 사용자 가 bash 셸 명령 셸 인터페이스 를 사용 할 때 만 환경 변 수 를 불 러 옵 니 다. 그러나 프로그램 이 실 행 될 때 환경 변 수 를 읽 지 못 할 수도 있 습 니 다./etc/profile 만 전역 적 입 니 다. 즉, 셸 로그 인 을 담당 하 는 것 도 프로그램 이 실 행 될 때 유효 합 니 다.
/etc/profile. d 디 렉 터 리 설정 파일 에서 셸 설정 을 수집 합 니 다.
jupyter notebook
위 에서 우 리 는 ENV 나/etc/profile 을 사용 하 는 등 다음 설정 프로그램의 환경 변 수 를 기록 했다.
그러나 Jupyter notebook 은 일반적인 프로그램 이 아니 기 때문에 자신의 운영 원리 와 커 널 이 있 기 때문에 Jupyter notebook 을 시작 한 후 환경 변 수 는 Liux 시스템 의 환경 변수 와 완전히 일치 하지 않 습 니 다.
Jupyter notebook 의 환경 변 수 를 어떻게 설정 하 는 지 탐색 해 보 겠 습 니 다.
영구적 인 정적 변 수 를 만 듭 니 다.
영구적 인 정적 변 수 를 설정 하면 Dockerfile 의 ENV 방식 을 사용 할 수 있 습 니 다.
예 를 들 면:
ENV JAVA_HOME=/spark/java/jre1.8.0_181  JRE_HOME=/spark/java/jre1.8.0_181  CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin:/usr/local/python37/bin
ENV PYSPARK_PYTHON  python3
ENV PYSPARK_DRIVER_PYTHON   python3

이렇게 설 정 된 시스템 환경 변 수 는 jpyter noterbook 에서 동기 화 할 수 있 습 니 다.
Jupyter noterbook 에서 명령 사용 하기
!env

모든 환경 변 수 를 출력 할 수 있 습 니 다.
ENV 방식 으로 설 정 된 환경 변 수 는 Jupyter noterbook 에서 인식 할 수 있 습 니 다.
영구적 인 동적 변 수 를 만 듭 니 다.
그러나 만약 에 우리 에 게 동적 변수 가 있다 면 Jupyter 의 미 러 를 시작 한 후에 야 값 이 있 는 환경 변수 입 니 다!env 는 가 져 올 수 없고 Dockfile 의 ENV 방식 으로 설정 할 수 없습니다. 그러면 동적 환경 변 수 를 설정 하여 Jupyter notebook 을 식별 할 수 있 는 다른 방법 이 있 습 니까?
방안 은 아래 와 같다.
Jupyter notebook 초기 화 된 소스 코드 에서 수정 증가
예 를 들 어/etc/init. d/post start. sh 파일 에 추가 합 니 다.
export PYSPARK_SUBMIT_ARGS="--master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}  --deploy-mode client --conf spark.executor.memory=8g --conf spark.executor.cores=2 --conf spark.executor.instances=2 --conf spark.executor.pyspark.memory=1g --conf spark.driver.memory=2g pyspark-shell"

또는/lib/systemd/system/jupyer - notebook. service 파일 수정
환경 변 수 를 다음 과 같이 추가 합 니 다.
Environment=MYOWN_VAR=theVar

입력 상자 cell 에서 명령 사용 하기
이러한 방식 은 자동 으로 설정 할 수 없고 수 동 으로 설정 할 수 있 습 니 다. 예 를 들 어 cell 상자 에 입력 할 수 있 습 니 다.
%env MY_VAR=MY_VALUE 


%env  PYSPARK_SUBMIT_ARGS="--master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}  --deploy-mode client --conf spark.executor.memory=8g --conf spark.executor.cores=2 --conf spark.executor.instances=2 --conf spark.executor.pyspark.memory=1g --conf spark.driver.memory=2g pyspark-shell"

혹은
import os
os.environ['PYSPARK_SUBMIT_ARGS'] ="--master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}  --deploy-mode client --conf spark.executor.memory=8g --conf spark.executor.cores=2 --conf spark.executor.instances=2 --conf spark.executor.pyspark.memory=1g --conf spark.driver.memory=2g pyspark-shell"

또는 여러 환경 변 수 를 파일 에 쓰 거나, 예 를 들 어 VARIABLENAME=VARIABLE_VALUE 가. env 파일 에 기 록 됩 니 다.
사용 명령
import os
env_vars = !cat ../script/.env
for var in env_vars:
    key, value = var.split('=')
    os.environ[key] = value

python - dotenv 도 빌 릴 수 있어 요.
'env' 라 는 파일 을 새로 만 듭 니 다. 다음 명령 으로 불 러 옵 니 다.
사용 명령
%load_ext dotenv
%dotenv

생 성 된 Yml 에서 이름 사용 하기
k8s 방식 으로 배 치 된 hub 나 Jupyter 북 이 라면Yml 에서 extraconfig 나 lifecycle Hooks 방식 을 사용 할 수 있 습 니 다.
extraConfig
hub:
  nodeSelector:
    kops.k8s.io/instancegroup: nodes
  extraEnv:
    JUPYTER_ENABLE_LAB: 1
    HOST: "jp.test.com"
  resources:
    requests:
      cpu: 100m
      memory: 2Gi
    limits:
      cpu: 200m
      memory: 4Gi
  extraConfig: |
    import os
    c.JupyterHub.authenticator_class = 'oauthenticator.gitlab.GitLabOAuthenticator'
    #c.KubeSpawner.cmd = ['jupyter-labhub']
    #c.GitLabOAuthenticator.scope = ['api read_repository write_repository']
    c.GitLabOAuthenticator.oauth_callback_url = "http://git.test.com/hub/oauth_callback"
    c.GitLabOAuthenticator.client_id = "123"
    c.GitLabOAuthenticator.client_secret = "123"
    c.GitLabConfig.access_token = "123"
    c.GitLabConfig.url = "http://git.test.com"

    async def add_auth_env(spawner):
      auth_state = await spawner.user.get_auth_state()
      if not auth_state:
          spawner.log.warning("auth failed %s", spawner.user)
          return
      spawner.environment['GITLAB_ACCESS_TOKEN'] = auth_state['access_token']
      spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username']
      spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id'])
      spawner.environment['GITLAB_USER_EMAIL'] = auth_state['gitlab_user']['email']
      spawner.environment['GITLAB_USER_NAME'] = auth_state['gitlab_user']['name']
      spawner.environment['ENV'] = 'prod'
      spawner.environment['PYSPARK_SUBMIT_ARGS']='--master k8s://https://'+os.environ.get("KUBERNETES_SERVICE_HOST","10.1.0.1")+':'+os.environ.get("KUBERNETES_SERVICE_PORT",443)+'  --deploy-mode client --conf spark.executor.instances=2 pyspark-shell'


혹은
  lifecycleHooks:
    postStart:
      exec:
        command:
          - "sh"
          - "-c"
          - >
            sed -i "1ispark.master k8s://https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" $SPARK_HOME/conf/spark-defaults.conf ;
            echo "spark.driver.pod.name ${HOSTNAME}" >> $SPARK_HOME/conf/spark-defaults.conf ;
            echo "spark.driver.host `hostname -i`" >> $SPARK_HOME/conf/spark-defaults.conf ;
            if [ -x /etc/init.d/poststart.sh ] ; then
              /etc/init.d/poststart.sh prod;
            fi;
            if [ -x /usr/bin/git ]; then
                echo "https://oauth2:${GITLAB_ACCESS_TOKEN}@git.test.com" > ~/.git-credentials;
                mkdir -p $HOME/.config/git ;
                echo -e 'hail*.log
.ipynb_checkpoints
__pycache__/
*.egg-info/
.eggs/
.cache/
.mypy_cache/
.DS_Store' > $HOME/.config/git/ignore; /usr/bin/git config --global credential.helper store; /usr/bin/git config --global user.email "${GITLAB_USER_EMAIL}"; /usr/bin/git config --global user.name "${GITLAB_USER_LOGIN}"; fi;

커 널 파일 수정
또 하나의 설정 방식 은 커 널 파일 을 수정 하 는 것 입 니 다. kernel. json, Jupyter notebook 의 원 리 는 kernel 과 다른 언어 환경 을 시작 하 는 것 이기 때문에 환경 변 수 는 kernel 과 밀접 한 관 계 를 가 집 니 다.
주 피 터 노트북 을 시작 할 때마다 환경 변수 가 적용 되 기 를 원한 다 면 kernel. json 을 수정 해 보 세 요.
우선 환경 변 수 를 설정 하 는 ipython 커 널 을 만들어 야 합 니 다.
절 차 는 다음 과 같다.
1. 문서 읽 기https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel- specs 2, Liux 시스템 셸 에서 명령 jupyter kernelspec list 를 사용 하여 어떤 kernels 와 그들의 파일 이 어디 에 저장 되 어 있 는 지 확인 합 니 다. 3. 그 중에서 우리 가 필요 로 하 는 파일 kernel. json 을 복사 합 니 다. 예 를 들 어 python 3 환경의 4, 파일 이름과 그 중의 일부 내용 을 수정 합 니 다.다시 복사, 주로 display 수정name 과 env 는 다음 과 같 습 니 다.
{
 "display_name": "Python 3 with environment",
 "language": "python",
 "argv": [
  "/usr/bin/python3",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "env": {"LD_LIBRARY_PATH":""}
}

참고 자료: jupyter 노트북 에서 변 수 를 설정 하 는 방법

좋은 웹페이지 즐겨찾기