도커 이미지를 만들기 위해 Dockerfile을 작성하게 되는데,
컨테이너 생성 시 실행할 명령어를 지정하기 위해 Dockerfile 내에 CMD, ENTRYPOINT 명령어를 사용하게 된다.
컨테이너가 생성되며 웹 서버, DB 서버 등 어플리케이션을 구동시킬 때 많이 사용하게 되는데
이럴 경우 리눅스 환경 변수 로딩은 되지 않는 경우가 발생할 수 있다.
구동시킨 어플리케이션에서 이런 환경 변수가 필요하지 않다면 문제될 것이 없지만
필요하다면 정상적으로 동작하지 않을 수 있기 때문에 이 부분에 관해서 알아두고 정상적으로 로딩되게할 필요가 있다.
작성자 같은 경우에는 Apache Airflow를 ENTRYPOINT 명령어를 통해 구동시키게 Dockerfile을 작성하고 컨테이너 구동 후에
Airflow DAG내에서 환경 변수가 필요한 작업을 하였는데 정상 동작하지 않아 환경 변수 로딩이 되지 않은 것을 알게되었다.
처음에는 Airflow의 내부 동작이 원인인줄 알았으나 확인하다보니 Airflow와의 상관없는 Docker와 shell 관련 문제임을 알게되었다.
이해를 위해서는 먼저 리눅스 shell에 대한 약간의 지식이 필요하다.
(나름 찾아보면서 정리하였으나 정확한 지식이 아닐 수 있으니 잘못된 점이 있으면 알려주면 감사하겠다. 🙂)
리눅스 shell 종류
리눅스 shell은 다음과 같이 login shell인지, interactive shell인지에 따라 구분이 된다.
- login shell과 non login shell
- interactive shell과 non interactive shell
login shell은 최초로 로그인한 쉘을 의미하는데, putty나 iTerm 같은 터미널 툴로 생성된 쉘은 로그인 쉘이고
쉘에서 쉘 스크립트 파일을 실행하면 이 스크립트 파일은 non login shell로 실행되는 것 같다.
그리고 interactive shell은 입력을 사용자에게 받는 것이고 non interactive shell은 그렇지 않은 것이다.
따라서 터미널 툴로 생성된 쉘은 login shell이자 interactive shell이고
쉘 스크립트를 수행한 경우는 non login shell이자 non interactive shell이 된다.
다시 돌아와서, Dockerfile에서 다음과 같이 ENTRYPOINT를 사용해서 Airflow를 구동시켰고
ENTRYPOINT["/Users/user/scripts/airflow_start.sh"]
Airflow DAG 안에서 /etc/profile.d 디렉토리 내의 sh 파일에서 설정된 환경 변수를 사용하였으나 환경 변수가 설정되지 않은 상태가 문제가 발생한 것이다.
스크립트 파일을 실행했기 때문에 non login & non interactive shell로 실행되었고
non login 쉘인 경우 /etc/profile이 실행되지 않는데 /etc/profile 내에서 /etc/profile.d 디렉토리 내의 sh 파일들을 실행하기 때문이다.
다음과 같이 login shell로 동작하도록 수정하니 필요한 환경 변수 사용이 가능했다.
ENTRYPOINT["bash", "-l", "/Users/user/scripts/airflow_start.sh"]
다음 자료들을 더 참고해보면 이해가 쉬울 것이다.
- https://stackoverflow.com/questions/18186929/what-are-the-differences-between-a-login-shell-and-interactive-shell
- https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell
- https://dog-developers.tistory.com/61
- https://mug896.github.io/bash-shell/login_non-login.html
'개발' 카테고리의 다른 글
Colima Docker DNS 오류 (0) | 2023.01.31 |
---|---|
DDD START! 책 내용 정리 (0) | 2022.11.21 |
자주 사용하는 Docker 명령어 모음 (0) | 2021.10.22 |
카프카, 데이터 플랫폼의 최강자 - 6장 카프카 운영 가이드 (0) | 2020.09.12 |
카프카, 데이터 플랫폼의 최강자 - 4장 카프카 프로듀서 (0) | 2020.09.06 |