사용자가
image
를 생성하기 위해 call 할 수 있는 모든 명령어들을 담은 text 문서
Dockerfile
로 부터 명령어를 읽어 자동으로 image 를 build 할 수 있다.순서대로
실행한다.From
명령어로 시작 해야한다.From
명령어는 build 할 image의 Parent Image
이다.From
에서 설정하는 Imageparent image
에 기초한다.필요한 모든 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
...
# 태그명 생략해 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 실행 명령어docker build -t ajae-app:latest .
ajae-app
이라는 이름의 image 를 latest
태그를 달아 생성한다..
: Dockerfile의 위치를 옵션으로 넣어준다.docker run ajae-app
생성한 이미지를 실행해본다.
앞서 생성한 이미지의 크기를 확인해보면
586.25MB
크기이다. 이것은 복잡한 기능을 하지 않는 간단한 python 파일을 이미지로 생성한 것에 비해 너무 크다.
작고 빠른 이미지 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
를 사용하는 것을 추천하지 않는다고 한다.
| https://pythonspeed.com/articles/base-image-python-docker-images/
문서를 참고해 경량화 이미지 slime-buster
를 선택했다.
FROM python:3.8-slim-buster
최종 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 image
에 pip
이 들어있기 때문에 requirement.txt
만 설치하면 된다.우리의 최종 목표는 Gitops !
ENV
환경변수로 git repo 같은 곳에 공개할 수 없는 key 를 적을 경우, gitops
로 완전한 CI/CD 자동화를 할 수 없다.ENV
환경변수로 넣기 보다 k8s secret
object 를 사용해 pod
에서 배포 시 환경변수를 적용할 수 있도록 한다.