Python 프로그램을 Dockerize하는 방법을 설명합니다.
Python 프로그램
테스트로 사용할 간단한 프로그램입니다.
import signal
import time
from absl import app
from absl import flags
from absl import logging
FLAGS = flags.FLAGS
flags.DEFINE_string('echo', None, 'Text to echo.')
interruppted = False
def handle(*args):
logging.info('Signal catched. Exiting.')
global interruppted
interruppted = True
def main(argv):
del argv # Unused
logging.info('This is a docker-python program.')
signal.signal(signal.SIGINT, handle)
signal.signal(signal.SIGTERM, handle)
while not interruppted:
logging.info(f'Echo: {FLAGS.echo}')
time.sleep(1)
logging.info('Done.')
if __name__ == '__main__':
app.run(main)
테스트 프로그램을 위해 새로운 venv 환경을 만들었습니다. 만드는 방법은 이전 글을 참고해주세요.
2021.05.29 - [실습] - pyenv와 venv로 python 버전과 pip 패키지 관리하기 (1/2)
실험을 위해 absl-py를 설치하였습니다. 설치된 pip 패키지를 requirements.txt에 저장합니다.
$ pip freeze > requirements.txt
requirements.txt의 내용은 다음과 같습니다.
absl-py==0.13.0
six==1.16.0
프로그램을 실행화면 argument로 주어진 echo 값을 계속 출력하고 ctrl-c를 누르면 종료합니다.
$ python main.py --echo="Hello, docker-python."
I0710 15:58:29.639849 140605817299072 main.py:20] This is a docker-python program.
I0710 15:58:29.639967 140605817299072 main.py:26] Echo: Hello, docker-python.
I0710 15:58:30.641226 140605817299072 main.py:26] Echo: Hello, docker-python.
I0710 15:58:31.642528 140605817299072 main.py:26] Echo: Hello, docker-python.
I0710 15:58:32.643805 140605817299072 main.py:26] Echo: Hello, docker-python.
^CI0710 15:58:32.938784 140605817299072 main.py:13] Signal catched. Exiting.
I0710 15:58:33.644753 140605817299072 main.py:29] Done.
Dockerfile 만들기
# syntax=docker/dockerfile:1
# Python 버전 선택
# 필요한 버전을 https://hub.docker.com/_/python 여기서 확인할 수 있습니다.
FROM python:3.9.6-slim-buster
# 디폴트 폴더 변경
WORKDIR /app
# Pip 패키지 설치
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
# 필요한 파일을 복사
COPY main.py main.py
CMD [ "python3", "main.py", "--echo=Hello, docker-python in Container."]
위와 같이 Dockerfile을 main.py와 같은 위치에 작성합니다.
docker build 명령어로 docker-python이란 image를 빌드합니다.
$ docker build --tag docker-python .
[+] Building 26.5s (12/12) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 484B
=> [internal] load .dockerignore
=> => transferring context: 2B
...
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-python latest 2cad614723f4 14 seconds ago 122MB
이제 image를 실행해 봅시다.
$ docker run -it --name docker-python docker-python:latest
I0710 07:35:38.733284 140107333211968 main.py:20] This is a docker-python program.
I0710 07:35:38.733449 140107333211968 main.py:26] Echo: Hello, docker-python in Container.
I0710 07:35:39.734656 140107333211968 main.py:26] Echo: Hello, docker-python in Container.
I0710 07:35:40.735960 140107333211968 main.py:26] Echo: Hello, docker-python in Container.
I0710 07:35:41.737222 140107333211968 main.py:26] Echo: Hello, docker-python in Container.
^CI0710 07:35:41.822147 140107333211968 main.py:13] Signal catched. Exiting.
마지막으로 종료된 container를 삭제합니다.
$ docker rm docker-python
References & Links
[1] Build your Python image, https://docs.docker.com/language/python/build-images/
'실습' 카테고리의 다른 글
비트코인 Blockchain RPCs 사용 (0) | 2021.06.20 |
---|---|
Tensorflow Serving을 위한 Kubernetes Pod Readiness probe 설정 (0) | 2021.06.14 |
pyenv와 venv로 python 버전과 pip 패키지 관리하기 (2/2) (0) | 2021.05.30 |
pyenv와 venv로 python 버전과 pip 패키지 관리하기 (1/2) (0) | 2021.05.29 |
비트코인 풀노드 실행하기 (0) | 2021.05.25 |