본문 바로가기

실습

Python 스크립트 실행을 위한 Dockerfile 만들기

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/

[2] https://hub.docker.com/_/python