FROM apache/airflow:2.6.1
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
vim \
&& apt-get autoremove -yqq --purge \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
USER "${AIRFLOW_UID:-50000}:0"
- 이 Dockerfile은
Apache Airflow 2.6.1
버전을 기반으로(이미지를 가져옴), root 사용자로 패키지를 설치한 후, Vim을 추가로 설치함- 그런 다음 더 이상 필요하지 않은 패키지를 자동으로 제거하고, apt 캐시 및 패키지 목록과 관련된 파일을 삭제함
- 마지막 줄은 사용자를 변경하여 컨테이너에서 실행되는 프로세스에 대해 적절한 사용자 및 그룹 권한을 설정한다는 것 !
${AIRFLOW_UID:-50000}
는 환경 변수 AIRFLOW_UID를 참조하여 해당 값을 사용하지만, 환경 변수 AIRFLOW_UID가 설정되어 있지 않은 경우에는 기본값으로 50000을 사용함:0
은 사용자 그룹을 지정하는 것으로, 0은 root 그룹을 나타냄. 따라서 사용자가 50000이며 root 그룹에 속하게 된다는 의미 !
맨 아랫줄 0은 root 를 의미함
도커 이미지 목록 보기
docker images
도커 이미지 삭제
docker rmi [이미지 이름]
airflow_encore 이름으로 docker build
docker build -t airflow_encore .
id
나의 경우엔 uid = 1000(wsl에서 실행)
docker에서 폴더를 만들면 root 권한으로 만들어짐. username이 아니라
data 폴더의 소유주 변경(root -> user)
sudo chown 50000:1000 ./data
내가 쓸수있게 권한 변경 (7-소유자 7-그룹 5-제3자)
sudo chmod 775 ./data
그럼 이렇게 권한이 바뀐 걸 볼 수 있음 !
docker exec -it airflow /bin/bash
docker exec
: Docker 컨테이너 내에서 명령어를 실행하는 명령어입니다.-it
: 표준 입력(stdin)을 터미널로 연결하고, 상호 작용(interactive) 모드로 실행합니다.airflow
: 접속할 Docker 컨테이너의 이름입니다. 이 경우에는 "airflow"라는 이름의 컨테이너에 접속하게 됩니다./bin/bash
: 접속할 컨테이너 내에서 실행할 명령어입니다. 이 경우에는 Bash 셸을 실행하도록 지정하였습니다.
docker run -d -p 8080:8080 -v ~/encore0525/dags/:/opt/airflow/dags/ -v ~/encore0525/data/:/home/airflow/data --entrypoint=/bin/bash --name airflow airflow_encore -c '(airflow db init && airflow users create --username admin --password admin --firstname Anonymous --lastname Admin --role Admin --email test@test.com); airflow webserver & airflow scheduler
docker run
: Docker 컨테이너를 실행하는 명령어입니다.-d
: 컨테이너를 백그라운드에서 실행하고 터미널과 연결하지 않는 "detached" 모드로 실행합니다.-p 8080:8080
: 컨테이너의 8080 포트를 호스트의 8080 포트에 매핑합니다. 이렇게 하면 컨테이너 내부에서 실행되는 서비스에 로컬 머신에서 localhost:8080으로 접근할 수 있습니다.-v ~/encore0525/dags/:/opt/airflow/dags/
: 호스트 머신의 encore0525/dags/ 디렉토리를 컨테이너 내부의 /opt/airflow/dags/ 디렉토리에 마운트합니다. 이렇게 하면 해당 디렉토리에 위치한 DAG(Directed Acyclic Graph) 파일들을 사용할 수 있습니다.-v ~/encore0525/data/:/home/airflow/data
: 호스트 머신의 encore0525/data/ 디렉토리를 컨테이너 내부의 /home/airflow/data 디렉토리에 마운트합니다. 이렇게 하면 컨테이너 내부에서 해당 디렉토리에 위치한 데이터 파일에 접근할 수 있습니다.--entrypoint=/bin/bash
: Docker 이미지의 기본 entrypoint를 무시하고 /bin/bash로 설정합니다. 따라서 컨테이너가 Bash 셸로 시작됩니다.--name airflow
: 실행 중인 컨테이너에 "airflow"라는 이름을 지정합니다.airflow_encore
: 사용할 Docker 이미지를 지정합니다.-c '(airflow db init && airflow users create --username admin --password admin --firstname Anonymous --lastname Admin --role Admin --email test@test.com); airflow webserver & airflow scheduler'
: 이 명령어는 컨테이너 내부에서 실행될 것입니다. Airflow 데이터베이스를 초기화하고(airflow db init), 관리자 권한을 가진 사용자를 생성하고(airflow users create), 그 후 Airflow 웹 서버(airflow webserver)와 스케줄러(airflow scheduler)
그럼 이제 위 사진처럼 web에 접속가능
강사님이 주신 naver_stock.py 파일을 dags 폴더 안에 넣음
dags에서 실행
제대로 실행된 것 확인
제대로 파일이 생성되었는지 확인
물론 container안이 아니라 local에서도 파일을 확인 가능