[Docker] pipenv기반의 장고 개발 환경 구축

최영섭·2024년 5월 5일
0

0. 배경

  • Langwatch를 사용하면서 파이썬 버전을 높여야할 필요성이 생겼다.
  • 이번 변경에서 기존 pip를 사용하다 pipenv를 사용하게 되었는데 나(영섭)의 로컬에서 셋업이 되지 않게 되었다.
  • 여러시도를 하다 결국 포기하고 나는 개인적으로 도커 컨테이너 내부에서 돌리기로 결정하였다

1. docker파일 작성

# Python 이미지 사용
FROM python:3.10.11-slim-bullseye

# 도커 컨테이너 내부에서 실행할 기본 디렉토리 설정
WORKDIR /app

# pipenv를 설치, 불필요한 캐시 없도록 하여 이미지 크기 줄임
RUN pip install --no-cache-dir pipenv

# 전체 소스코드 옮기기 전 Pipfile과 Pipfile.lock 먼저 컨테이너로 복사
COPY Pipfile Pipfile.lock ./

# 의존성을 설치, --deploy로 Pipfile과 Pipfile.lock비교해서 불일치시 빌드 실패
RUN pipenv install --deploy

# 전체 소스코드 컨테이너로 복사
COPY . .

# 포트 8000 외부로 노출
EXPOSE 8000

# 컨테이너 실행 시 pipenv 환경 내에서 Django 서버를 실행
CMD ["pipenv", "run", "python", "manage.py", "runserver", "0.0.0.0:8000"]

2. 실행 명령어

docker run -it --rm \
  -v $(pwd):/app \
  -v $(pwd)/.env:/app/.env \
  -v /etc/timezone:/etc/timezone:ro \
  -v /etc/localtime:/etc/localtime:ro \
  -p 8000:8000 \
  --name django_dev_container \
  ASKu-AI-API pipenv run python manage.py runserver 0.0.0.0:8000

-it: docker 컨테이너 내부의 cmd를 사용할 수 있도록 하는 옵션 이는 컨테이너 내부에서 직접 입력을 수행하고 결과를 보기 위해 사용됩니다. 예를 들어, 컨테이너 내부의 Django 개발 서버 로그를 실시간으로 확인하거나 디버깅할 때 유용

--rm: 컨테이너가 종료되면 자동으로 해당 컨테이너를 삭제하는 옵션, 개발 과정에서 임시적으로 생성된 컨테이너를 자동으로 정리하여 시스템을 깔끔하게 유지

-v $(pwd):/app: 현재 작업 디렉토리($(pwd))를 컨테이너의 /app 디렉토리에 마운트합니다. 로컬에서 개발 중인 코드가 컨테이너 내부에서 즉시 반영되도록 하여 개발환경에서 바로 테스트 가능

-v $(pwd)/.env:/app/.env: 프로젝트 파일내의 .env파일을 컨테이너 내에서 환경변수로 참조할 수 있도록 하는 옵션. 루트 위치의 .env 파일을 컨테이너의 /app/.env 위치에 마운트

v /etc/timezone:/etc/timezone:ro: 나의 로컬환경과 컨테이너 내부 환경의 시간대 동기화. 호스트 시스템의 시간대 설정 파일을 컨테이너에 읽기 전용으로 마운트

v /etc/localtime:/etc/localtime:ro: 나의 로컬환경과 컨테이너 내부 환경의 시간대 동기화. 호스트 시스템의 로컬 시간 파일을 컨테이너에 읽기 전용으로 마운트, 이 옵션을 통해 호스트 시스템과 정확히 동일한 시간 정보를 컨테이너가 사용

p 8000:8000: 호스트의 8000 포트와 컨테이너의 8000 포트를 연결 이는 외부에서 컨테이너 내 실행 중인 Django 개발 서버에 접근가능

--name ASKu-AI-API: 컨테이너 이름 지정

profile
세상에 필요한 것을 고민하고 그것을 만드는 과정에서 문제를 해결하는 일이 즐겁습니다. 창업, 백엔드, RAG에 관심을 가지고있습니다.

0개의 댓글