FROM apache/airflow:2.5.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/*
Dockerfile 내에서 패키지를 설치하고 이미지를 최적화
1. `apt-get update`: 패키지 목록을 업데이트합니다.
2. `apt-get install -y --no-install-recommends vim`: vim 패키지를 설치하고 권장 패키지를 설치하지 않도록 합니다.
3. `apt-get autoremove -yqq --purge`: 불필요한 패키지를 자동으로 제거합니다.
4. `apt-get clean`: apt의 캐시를 지웁니다.
5. `rm -rf /var/lib/apt/lists/*`: 패키지 목록과 관련된 임시 파일을 제거합니다.

USER airflow

# app으로 requirements.txt 복사
COPY requirements.txt /app/requirements.txt
RUN pip3 install -r /app/requirements.txt


그냥하면 되는걸 왜 복사하고 설치할까?

Docker는 각 명령어를 캐싱하여 이미지 빌드 속도를 높이려고 합니다. 만약 COPY requirements.txt /app/requirements.txt 를 먼저 수행하고, 그 후에 소스 코드의 변경이 없는 경우 Docker는 이전 단계를 캐시하고 pip3 install을 다시 실행하지 않습니다. 이로써 이미지 빌드가 더 빨라집니다.

만약 소스 코드가 변경되지 않았고, requirements.txt 파일도 변경되지 않았다면, Docker는 이전에 설치된 패키지를 그대로 사용할 수 있습니다. 따라서 COPY ~ 를 따로 두는 것은 이미지 빌드 성능을 최적화하는 한 방법입니다.


# DAG 파일 복사
COPY dags/ /opt/airflow/dags/

 

실습 1 : hello world

  • node.js 로 간단하게 코드를 짜보자. 
  • 순서 : os선택, node설치, 코드작성, 프로그램실행 -> 이 모든것 dockerfile에 기술

 

 

dockerfile

  • dockerfile 구조:

docker file의 구조

 

  • dockerfile 구조 예
    from node: alpine  : node(도커이름), alpine(os이름)
    copy ./app : 현재 디렉토리 내용 모두 도커의 /app에 저장 
    workdir /app : 기본 위치를 /app로 지정
    cmd node app.js : /app내의 app.js 실행
  • 그외 기타 키워드
    1) ARG : 도커 image를 만들때 사용되는 변수, 최종 이미지에는 포함안됨
    2) ENV : 최종이미지에 저장되는 변수, 컨테이너가 실행될 때 사용됨. 
    3) USER : 컨테이너 os 계정 ID
    4) EXPOSE : 서비스를 사용할 포트번호
    5) RUN : 빌드를 위해 실행 돼야 하는 명령들, 예) RUN apt-update && apt-get install -y curl 
  • CMD vs ENTRYPOINT
    1) 컨테이너 시작시 실행 돼야 하는 명령어를 지정
    2) 일반적으로 둘중에 하나쓰임
    3) 명령어를 여러개 쓰면 마지막 것만 실행됨

    4) 사용예
    # 기본 이미지로 사용할 것을 선택합니다.
    FROM python:3.8
    # 작업 디렉토리를 설정합니다.
    WORKDIR /app
    # 호스트의 현재 디렉토리에 있는 파일을 작업 디렉토리로 복사합니다.
    COPY . /app
    # 필요한 패키지를 설치합니다.
    RUN pip install -r requirements.txt
    # Python 인터프리터를 사용하여 "app.py" 스크립트를 실행하도록 지정
    CMD ["python", "app.py"]
    or ENTRYPOINT  ["python", "app.py"]

    5) 같이 사용할때(거의  사용안함)
    entry 가 기본명령 , cmd가 인자 제공
    cmd는 그냥 뒤에 쓰면 덮어쓰기가 되고, enrty는 --entrypoint 옵션을 통해서 덮어쓰는게 가능

 

 

실제 dockerfile 예

  • ARG는 최종까지, ENG는 빌드할때만 사용됨
  • copy : aiflow.cfg 파일을 복사
  • RUN : airflow라는 유저로 지정
  • EXPOSE : 포트넘버 지정
  • USER : airflow를 유저로 지정
  • WORKDIR : 기본 지정
  • ENTRY , CMD : 명령어 지정 

 

docker lmage 생성

  • 이미지 이름 hello~ '.' 은 현재 페이지를 의미 
  • --platform ~ : 도커빌드 os (M1) , 실행 os(리눅스) 차이에 의한 호환성 문제 , 해결위한 명령어
  • 생성 확인
  • 다른 컴퓨터에서 실행하려면 dorker 클라우드(docker hub) 로 먼저 등록

 

 

 

+ Recent posts