다용도 로컬 파이프라인 구성

Poetry + 도커컨테이너 모듈 의존성 간편화2

필만이 2024. 7. 16. 14:21

이전포스트

과거 잘못된 도커 내 poetry 설치(https://makenow90.tistory.com/3)

배경

저번에 1편에서 컨테이너에 poetry를 설치하는데는 성공했지만, 도커 내에 poetry 가상환경을 만든꼴이 됐다.
poetry는 의존성 관리에만 사용하고, 도커 내에서는 가상환경을 실행하지 않도록 바꾸려한다.

도커파일

FROM apache/airflow:2.7.3

USER root

# 필요한 시스템 패키지 설치
# 1줄: 패키지 관리 시스템이 최신 패키지 정보를 얻도록 함.
# 2줄: 원격 서버에 SSH 프로토콜을 통해 접속할 수 있게 함.
# -y 설치중 사용자 확인을 자동으로 승인
# 3줄: 다운로드한 패키지 파일을 삭제하여 캐시를 정리,
# 디스크 공간을 절약해 이미지 크기를 줄임
# 4줄: apt-get update로 다운된 패키지 목록 파일들은
# /var/lib/apt/lists/에 저장됨. 삭제해서 이미지 크기 줄임
RUN apt-get update && \
   apt-get install -y openssh-client && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*


# airflow 그룹 및 사용자 설정. 원래 일반적인 경우 dockerfile에서 airflow 계정을 따로 만들 필요가 없다
# 그러나 이 작업은 관리자(USER root)에서만 가능해서 airflow를 만들고 권한을 부여하는 과정이 추가됐다
# 1줄: airflow라 그룹을 만듦. 그룹이 이미 존재하면 에러없이 넘김(-f)
# 2줄: airflow 사용자를 airflow 그룹에 추가. 사용자를 보조 그룹에 추가(-aG)
RUN groupadd -f airflow && \
    usermod -aG airflow airflow

# airflow 사용자가 sudo 명령을 사용할 때 암호를 묻지 않고 모든 명령을 실행하게 함
RUN echo "airflow ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

# 이따가 /usr/local 경로에 airflow로 의존성들을 설치해야해서, 소유 및 권한 부여 해야함
# 1줄: /usr/local 디렉토리와 그 하위 모든 파일 및 디렉토리의 소유자를 airflow 
# 사용자와 airflow 그룹으로 재귀적(-R)으로 변경
# 2줄: 소유자, 그룹에게 읽기, 쓰기, 실행[7(rwx)] 권한 부여
# 일반적인 설정(다른 사용자에게 읽기 및 실행[5 (r-x)] 권한을 부여)
RUN chown -R airflow:airflow /usr/local && \
    chmod -R 775 /usr/local

USER airflow
WORKDIR /app

# poetry 설치 및 환경 변수 설정
# pip와 같은 도구를 사용자 모드(--user)로 설치하면 바이너리 파일이 
# /home/airflow/.local/bin 디렉토리에 위치. 이 경로를 PATH에 추가하면, 
# 이 디렉토리에 명령어를 전역에서 실행할 수 있다.
ENV PATH="/home/airflow/.local/bin:${PATH}"
# 1줄: 최신 버전의 pip 설치로 최신 기능과 보안 패치를 활용. 
# --user 옵션은 패키지를 전역적으로 설치하지 않고 현재 사용자 계정에 설치
# 2줄: poetry를 현재 사용자 계정에 설치
# 3줄: poetry가상 환경을 별도로 만들지 않고 시스템의 파이썬 환경을 사용하도록 설정
RUN pip install --user --upgrade pip && \
    pip install --user poetry && \
    poetry config virtualenvs.create false

# 의존성 파일 복사
COPY pyproject.toml poetry.lock /app/

# 의존성 설치, 사용자 입력을 요구하지 않음, ANSI는 사람이 읽기 어렵고, 특히 로그 파일에서 문제가 돼서 
# 이스케이프 시퀀스가 포함되지 않도록 함
RUN poetry install --no-interaction --no-ansi

# 애플리케이션 코드 복사
COPY . /app