2. Dockerfile 작성하기

jjuyaa·2022년 12월 7일
0

GitOps

목록 보기
2/7


Dockerfile 이란?

사용자가 image 를 생성하기 위해 call 할 수 있는 모든 명령어들을 담은 text 문서

  • Docker 는 Dockerfile 로 부터 명령어를 읽어 자동으로 image 를 build 할 수 있다.
  • Docker 는 Dockerfile 내부의 명령어들을 순서대로 실행한다.
  • Dockerfile 은 반드시 From 명령어로 시작 해야한다.
  • From 명령어는 build 할 image의 Parent Image 이다.

Parent Image 란?

  • From 에서 설정하는 Image
  • 이후의 명령어들은 모두 이 parent image 에 기초한다.

Python 기반 Dockerfile 생성하기

1. requirement.txt 파일 생성하기

필요한 모든 libaray 를 문서로 관리하는 것이 좋다.

pip3 freeze > requirements.txt
해당 명령어로 pip 으로 설치한 모든 파이썬 lib 를 requirement.txt 문서 내부에 작성할 수 있다.

📍 venv 환경에서 실행해 꼭 필요한 lib 만 배포할 수 있도록 하는 것이 좋다.

결과 :

certifi==2022.9.24
charset-normalizer==2.1.1
et-xmlfile==1.1.0
idna==3.4
numpy==1.23.4
...

2. ubuntu 기반 이미지 dockerfile 작성

# 태그명 생략해 ubuntu 최신 버전(Latest) 기반 이미지 제작
FROM ubuntu
WORKDIR /ajaeBot-docker/app
COPY . ./
RUN \
    apt-get update -y && \
    apt-get install -y python3 python3-pip python3-dev build-essential && \
    pip3 install -r requirements.txt
ENV SLACK_BOT_TOKEN='...'
CMD ["python3","joke_mention_test.py"]
  • # 로 작성된 주석은 Layer 에 포함되지 않는다.
  • WORKDIR : Docker 이미지 내부에서 RUN,CMD,ENTRYPOINT 의 명령이 실행될 dir 설정한다.
  • COPY : host 내부 파일 전부 container의 WORKDIR 내부에 복사
  • RUN : python3 pip3 설치 & requirements.txt 의 모듈 설치
  • ENV : application에서 필요한 환경 변수 설정
  • CMD : image 실행 명령어

이미지 build & run

docker build -t ajae-app:latest .
  • ajae-app 이라는 이름의 image 를 latest 태그를 달아 생성한다.
  • . : Dockerfile의 위치를 옵션으로 넣어준다.
docker run ajae-app

생성한 이미지를 실행해본다.

❓ python 기반 파일에서 base image 로 Untuntu 사용하는 것이 맞을까?

앞서 생성한 이미지의 크기를 확인해보면 586.25MB 크기이다. 이것은 복잡한 기능을 하지 않는 간단한 python 파일을 이미지로 생성한 것에 비해 너무 크다.

Base 이미지 경량화

Alpine alpine 이미지의 문제점?

작고 빠른 이미지 build 를 위해 많이 사용하는 것은 python:3.8-alpine 이미지이다.
https://pythonspeed.com/articles/alpine-docker-python/
문서에 따르면

"Standard PyPI wheels 이 Alpine 에서 작동하지 않는다. 그런데 대부분의 python packages 는 설치 속도를 빠르게 하기 위해 PyPI 에서 binary wheels 를 포함한다. 따라서 Alpine Linux 를 사용한다면 사용한 모든 python package를 C code로 compile 해야한다. "

이외에도 여러가지 문제(?).. 로 python image 에서 linux alpine 를 사용하는 것을 추천하지 않는다고 한다.

Slim 이미지 사용하기

| https://pythonspeed.com/articles/base-image-python-docker-images/

문서를 참고해 경량화 이미지 slime-buster 를 선택했다.

FROM python:3.8-slim-buster

layer 줄이기

최종 Dockerfile 결과

FROM python:3.8-slim-buster
# Docker 이미지 내부에서 RUN,CMD,ENTRYPOINT 의 명령이 실행될 dir 설정
WORKDIR /ajaeBot-docker/app
# host 내부 파일 전부 container의 WORKDIR 내부에 복사
COPY . .
RUN pip3 install -r requirements.txt
CMD ["python3","joke_mention_test.py"]
  • Maintainer 은 더이상 안적어도 된다.
  • pyhon base imagepip 이 들어있기 때문에 requirement.txt 만 설치하면 된다.

공개할 수 없는 key 를 ENV 로 넣지 않는다.

우리의 최종 목표는 Gitops !

  • ENV 환경변수로 git repo 같은 곳에 공개할 수 없는 key 를 적을 경우, gitops 로 완전한 CI/CD 자동화를 할 수 없다.
  • ENV 환경변수로 넣기 보다 k8s secret object 를 사용해 pod 에서 배포 시 환경변수를 적용할 수 있도록 한다.

참고 문서

0개의 댓글