• Docker image 만들기

    2022. 1. 7. 13:15

    by. 위지원

    도커 허브에서 아래 bitnami airflow를 가져다가 compose up하려고했다. 

    그런데 코드 구동 시 필요한 라이브러리들이 없었공.. 😣

    사수님의 조언을 바탕으로 일일히 image 설치할 때마다 해당 라이브러리들을 설치할 순 없으니 bitnami image base로 requirements를 추가하여 라이브러리를 설치 후 해당 이미지를 사용하기로 했다.

    결론적으로 도커 빌드는 임시 컨테이너 생성 > 명령어 수행 > 이미지로 저장 > 임시 컨테이너 삭제 > 새로 만든 이미지 기반 임시 컨테이너 생성 > 명령어 수행 > 이미지로 저장 > 임시 컨테이너 삭제 > … 의 과정을 계속해서 반복한다고 볼 수 있습니다. 명령어를 실행할 때마다 이미지 레이어를 저장하고 다시 빌드할 때 Dockerfile이 변경되지 않았다면 기존에 저장된 이미지를 그대로 캐시처럼 사용합니다. 출처: https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html

     

    Dockerfile

    * 사전에 필요한 라이브러리는 requirements.txt에 저장해두어야한다 :)

    (airflow) airflow@DESKTOP-LQRSEG1:~$ pip freeze >> requirements.txt

     

    Dockerfile 이라는 파일안에 아래와 같이 작성하였다.

    FROM docker.io/bitnami/airflow:2
    MAINTAINER weejw <upsidejiwon@gmail.com>
    USER root
    RUN apt-get update -y
    RUN apt-get install -y python-pip python-dev build-essential
    COPY requirements.txt /opt/bitnami/airflow/requirements.txt
    WORKDIR /opt/bitnami/airflow
    RUN chmod 777 /opt/bitnami/airflow/requirements.txt
    RUN chown 1001 /opt/bitnami/airflow/requirements.txt
    RUN /bin/bash -c "source /opt/bitnami/airflow/venv/bin/activate && pip install -r /opt/bitnami/airflow/requirements.txt"
    USER 1001

    * /opt 아래가 root 권한이라서 USER 권한을 중간에 변경해주고 진행했다... :(

     

    빌드

    sudo docker build -t docker.io/local/airflow:2 .

     

    그럼 아래와 같이 이미지가 생긴다.  이에 REPOSITORY:TAG로 compose yml 파일에 적어두면 끝!!!

    REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE
    local/airflow                    2         63193bc26c8a   4 seconds ago   2.72GB

     

    yaml파일에 이렇게 말이다!

    airflow:
      image: local/airflow:2

     

    .. 근데 이번에는 DAG가 broken..되었다. 내 마음도 broken.. 

     

    그러다가 이 글을 통해 해결할 수 있겠다 생각되었다.

     

    bitnami에는

    airflow, airflow-worker, airflow-scheduler 3종류가 있다.

    이 셋 다 image를 다시 생성하고 빌드하고 이 이미지를 참조하게끔 했다!

     

    이제 된다 ^^! 해-결!

    으하하하하!!!! 햅삐!

     

    에러해결

    하아.. 도커 어렵다 어려웡 

     

    1)

    아래와 같은 에러는 위에처럼 Dockerfile에 USER root와 USER 1001을 작성해주면 된다. 

    Reading package lists...
    E: List directory /var/lib/apt/lists/partial is missing. - Acquire (2: No such file or directory)
    The command '/bin/sh -c apt-get update -y' returned a non-zero code: 100

     

    2)

    에러까진 아니고,, 아니다 라이브러리 설치에 6시간 걸리면 에러맞다 ㅡㅡ;;

    아래와 같은 정보가 뜨면서 lib 설치가 엄첨 오래걸린다. 

    INFO: This is taking longer than usual. 
    You might need to provide the dependency resolver with stricter 
    constraints to reduce runtime. If you want to abort this run, 
    you can press Ctrl + C to do so. To improve how pip performs, 
    tell us what happened here: https://pip.pypa.io/surveys/backtracking

     

    현 버전은 pip 21.3.1 으로 21.0 부터 생긴 문제라고한다 .;;  그래서 아래 2가지 해결 방법으로 해결하면 된다.

        1. pip 버전을 21 이하로 fix: pip install -U pip==20.3

        2.--use-deprecated=legacy-resolver 옵션 추가: pip install --use-deprecated=legacy-resolver -r requirements.txt

    * 2번은 말그대로 최신 dependecy의 resolver 사용하지 않는다는 말임 

     

     

    3) 

    bag file size가 너무 커서 local directory를 bind 하려고했다.. volume형태는 container에서 생성된 파일을 container별로 관리할 때 사용하는 것이므로,, 취지에 맞지않음

    아래처럼 docker-compse 파일 수정

    * 추가: Dockerfile에도 마운트할 폴더를 명시하는 것이 좋다고 한다.

    https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html

    version: '3.2'
    
    volumes:
    	- type: bind 
          source: /home/airflow/bag_data
          target: /opt/bitnami/airflow/bag_data
    
    volumes:
      bag_data:

     

    4) 

    airflow "Could not connect to the database"

    __init__() got an unexpected keyword argument 'resolver'

     

     

    이렇게 하고 빌드하고 run했더니 갑자기 database 연결이 안되었다. 그래서 그냥 airflow 재설치했다.

    그랬더니 해결되었다. 

    이미지 빌드부터 다시해야한다.

    db init error
    pip install apaache-airflow
    
    성공
    pip install "apache-airflow[celery]==2.2.3"

     

     

    REFERENCES

    https://www.daleseo.com/docker-volumes-bind-mounts/

    https://freedeveloper.tistory.com/182

    https://docs.docker.com/compose/compose-file/compose-file-v3/

    https://stackoverflow.com/questions/41299514/docker-compose-define-mount-for-bind-mount-and-managed-mount

    https://uiandwe.tistory.com/1315

    https://bluecolorsky.tistory.com/94

    https://github.com/WASdev/ci.docker/issues/194#issuecomment-433519379

     
     
     
     

    대화의 장 💬