Airflow Docker Volume 마운트하기
Airflow Docker에 volume을 마운트 하는 방법을 정리합니다. 도커는 컨테이너가 삭제되면 데이터도 같이 삭제됩니다. 지속적으로 저장이 필요한 파일을 관리한다면 도커 컨테이너의 생명 주기와 무관하게 파일을 저장할 수 있도록 설정이 필요합니다.
도커 볼륨 마운트
도커 컨테이너가 파일을 저장할 수 있도록 `도커 영역`의 외부 볼륨을 마운트하여 사용합니다. 이를 위해서 위의 그림과 같이 컨테이너가 생성될 때 파일시스템을 마운트 할 수 있도록 airflow의 docker-compose.yml파일을 수정해야 합니다.
Airflow 컨테이너 구조
Airflow 홈페이지에서 Airflow 실행을 위한 서버, DB 컨테이너를 구성하기 위한 'docker-compose.yml`파일을 제공합니다.v 파일에는 컨테이너 내부의 airflow 폴더는 도커가 실행되는 Filesystem의 `~/airflow`폴더와 연결하기 위한 volume 마운트에 대한 정보를 저장합니다.
// docker-compose.yml
...
volume:
-${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
-${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
-${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config
-${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
...
코드를 보면 위와 같이 airflow에서 필요한 각각의 폴더를 mount하기 위한 위치 정보가 저장되어 있습니다. 컨터이네 내부의 `dags`, `logs`, `configs`, `plugins` 각 폴더는 컨테이너를 실행시키는 파일시스템의 위치에 생성되어 사용됩니다. 자신의 서버에 위치한 `~/airflow/dags`폴더에 생성한 dag 파일을 컨테이너 내부의 airflow에서 인식이 가능합니다.
신규 볼륨 추가하기
컨테이너가 삭제되어도 유지가 필요한 파일을 저장하기 위해서 추가로 새로운 볼륨을 마운트합니다.
// docker-compose.yml
...
volume:
-${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
-${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
-${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config
-${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
-${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/mount
위의 코드에서는 `mount`폴더 이름으로 볼륨을 마운트 했습니다. 새로 생성한 mount폴더가 `root` 권한으로 생성되는 경우 파일 저장 permission이 없다는 에러가 나오면서 볼륨에 파일을 저장할 수 없습니다. 이 경우 docker composer파일에서 airflow가 실행되는 초기에 볼륨 마운트 권한을 수정하는 위치에 `mount`폴더를 추가합니다. 이제 실행된 airflow 컨테이너의 bash로 접속해서 새롭게 생성된 mount 폴더의 권한을 확인합니다.
sudo docker ps -a
---------------------
CONTAINER ID IMAGE
0fssf???? apache/airflow:2.6.3 ...
실행된 도커의 containerID를 확인하기 위해서 `sudo docker ps -a` 명령을 실행합니다.
sudo docker exec -it 0fdd8a4b983c /bin/bash
default@0fssf????:/opt/airflow$ ls
...
drwxrwxf-x 2 default root 4096 mount
...
새로운 mount 폴더가 생성되었고 컨테이터를 실행한 서버의 `~/airflow` 폴더에서도 마운트한 폴더를 확인할 수 있습니다.
'Programming' 카테고리의 다른 글
git config 초기설정 및 editor를 vim으로 변경하기 (0) | 2024.03.19 |
---|---|
Django Sitemap 만들기 (0) | 2024.03.19 |
Class Diagram 작성하기 - PlantUML (0) | 2024.03.19 |
REST API를 생성하고 호출하기 (2) | 2024.03.18 |
REST API(Representational State Transfer API) (1) | 2024.03.17 |