이 예제는 Python 기반 프로젝트를 Docker 이미지로 빌드하고 저장소에 푸시하는 방법을 설명합니다.
필수 준비사항
Docker가 시스템에 설치되어 있어야 합니다.
프로젝트 설정
프로젝트 루트 디렉토리에서 작업을 수행하면 해당 프로젝트만 포함된 이미지를 생성할 수 있습니다.
의존성 파일 생성
pip install pipreqs
# 의존성 목록 생성
pipreqs ./
# 인코딩 문제가 발생할 경우 아래 명령어 사용
pipreqs ./ --encoding=utf8 --force
# 실행 후 requirements.txt 파일이 생성됨
Dockerfile 구성
프로젝트 루트에 확장자 없는 Dockerfile을 생성하고 다음 내용을 추가합니다:
FROM python:3.7
ENV PATH /usr/local/bin:$PATH
ADD . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
CMD ["scrapy", "crawl", "quotes"]
- FROM: Python 3.7 베이스 이미지를 사용하여 Scrapy 프로젝트 실행 환경 구축
- ENV: PATH 환경변수에 /usr/local/bin 경로 추가
- ADD: 로컬 소스코드를 컨테이너 내 /app 디렉토리로 복사
- WORKDIR: 작업 디렉토리를 /app으로 설정하여 이후 명령어 실행 위치 지정
- RUN: requirements.txt에 명시된 Python 패키지 설치
- CMD: 컨테이너 시작 시 실행될 기본 명령어 정의
참고: 다운로드 속도가 느린 경우 알리바바 클라우드 미러를 활용할 수 있습니다.
이미지 빌드
다음 명령어로 Docker 이미지를 생성합니다:
docker build -t quotes:crawler .
빌드 성공 시 다음과 유사한 출력을 확인할 수 있습니다:
Sending build context to Docker daemon 191.5 kB
Step 1/6 : FROM python:3.7
---> 968120d8cbe8
Step 2/6 : ENV PATH /usr/local/bin:$PATH
---> Using cache
---> 387abbba1189
Step 3/6 : ADD . /app
---> a844ee0db9c6
Removing intermediate container 4dc41779c573
Step 4/6 : WORKDIR /app
---> 619b2c064ae9
Removing intermediate container bcd7cd7f7337
Step 5/6 : RUN pip3 install -r requirements.txt
---> Running in 9452c83a12c5
...
Removing intermediate container 9452c83a12c5
Step 6/6 : CMD ["scrapy", "crawl", "quotes"]
---> Running in c092b5557ab8
---> c8101aca6e2a
Removing intermediate container c092b5557ab8
Successfully built c8101aca6e2a
생성된 이미지 확인:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quotes crawler 41c8499ce210 2 minutes ago 769 MB
컨테이너 실행 및 테스트
# 컨테이너 실행
docker run -d --name quote-crawler quotes:crawler
# 실행 중인 컨테이너 확인
docker ps
# 컨테이너 내부 접속
docker exec -it quote-crawler /bin/bash
정상적으로 작동하는지 확인하고, 오류 발생 시 여러 번 재시도해보세요.
이미지 푸시
# 컨테이너를 새로운 이미지로 커밋
docker commit quote-crawler myuser/quotes:crawler
# 태그 추가
docker tag myuser/quotes:crawler myuser/quotes:latest
# Docker Hub 로그인
docker login
# 원격 저장소에 푸시
docker push myuser/quotes:latest