티스토리 뷰

반응형

airflow 를 기동할때 편의를 자주쓰는 유틸리티나 스크립트를 PATH 환경변수에 정의하고 데몬을 기동하여 사용하는 경우가 있다.

예를 들어, /home/user/foo/script 라는 경로에 내가 편의를 위해 만든 쉘스크립트를 넣고, PATH 환경변수에 지정해서 잘 쓰고 있었는데, BashOperator 에서 env 옵션을 사용하면 이상하게 해당 스크립트를 찾지 못하는 문제가 발생했다.

# export PATH=$PATH:/home/user/foo/script 가 시스템환경변수에는 존재함

## 이 녀석은 잘 실행되는데
BashOperator(
    task_id='t1',
    bash_command='myscript.sh',
)

## 이 녀석에서는 myscript.sh 를 찾지 못한다
BashOperator(
    task_id='t2',
    bash_command='myscript.sh',
    env={'SERVICE_NAME':'myhome'}
)

 

원인

BashOperator 코드를 살펴보면, 사용자가 정의한 env 에 정의된 값이 있으면 기본적으로는 사용자가 정의한 env 만 로딩하는 구조로 되어있다. 쉽게 생각하면 사용자가 env 값을 지정하면 딴 시스템환경변수는 생략된다는 말이다. 표로 정리하면 아래와 같다.

append_env 의 디폴트값은 false 이므로, env 인자를 넣게되면 system_env 값은 사라지게된다.

구분 append_env (true) append_env (false)
env (값 있음) system_env + env env
env (값 없음, NONE) system_env system_env

 

https://github.com/apache/airflow/blob/main/airflow/operators/bash.py#L183-L185

BashOperator 의 코드를 쫒아가보면 env 가 존재하면 시스템 환경변수는 무시된다

해결방법

결과적으로는 시스템환경변수(system_env) 위에, 사용자 환경변수 (env) 를 추가하는걸 원하기 때문에, append_env 옵션에 True 를 추가해주면 된다. (디폴트값은 false 임)

BashOperator(
    task_id='t1',
    bash_command='myscript.sh',
    env={'SERVICE_NAME':'myhome'},
    append_env = True
)

 

처음에 이거 몰라서 왜 실행안된느것이지 헤맸는데 헤메지 말자

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함