JustDoEat
django에서 dockerfile 설정 (~작성중) 본문
도커파일을 작성하기 위한 순서
1.기본이미지선택
2.환경변수 설정
3.작업 디렉토리 설정
4.패키지 설치 및 의존성 주입
5.포트개방
6.명령어 실행
일단 대략적인 순서만 기억
도커파일 작성
도커파일은 지금 프로젝트 기준으로 3개가 있어야 한다.
backend, frontend, nginx
backend
FROM python:3.11
# Python은 가끔 소스 코드를 컴파일할 때 확장자가 .pyc인 파일을 생성한다.
# 도커를 이용할 때, .pyc 파일이 필요하지 않으므로 .pyc 파일을 생성하지 않도록 한다.
ENV PYTHONDONTWRITEBYTECODE 1
# Python 로그가 버퍼링 없이 출력
ENV PYTHONUNBUFFERED 1
#공식문서에 나와있는 내용
# 이미지에 내에서 명령을 실행할 때 사용할 기본 작업 디렉토리를 설정
WORKDIR /backend
RUN pip install --upgrade pip
# 현재 로컬 디렉토리에 있는 requirements.txt를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY requirements.txt ./
RUN pip install -r requirements.txt
# haruProject/ 디렉토리 전체를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/ .
# haruProject/.env 파일을 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/.env ./
# Django 프로젝트 실행
# EXPOSE 8000 # 이 부분은 포트를 외부에 노출할 때 사용하지만, 현재 추세에서는 Docker Compose에서 포트 매핑을 지정하는 것이 권장됩니다.
# CMD ["daphne", "-b", "0.0.0.0", "-p", "8000", "config.asgi:application"] # 프로젝트 실행 명령어 (주석 처리된 이유는 Docker Compose에서 설정하는 것이 일반적이라서)
궁금증
# 이미지에 내에서 명령을 실행할 때 사용할 기본 작업 디렉토리를 설정
WORKDIR /backend
도커컴포즈에서한번에 빌드 하고 나면 위에서 말했듯이 backend, frontend, nginx 3개의 컨테이너가 생긴다.
backend컨테이너를 누르고 file을 누르면
아래와 같이 여러 폴더 및 파일들이 컨테이너에 들어가있을것을 볼 수 있다.
이 공간은 빌드를 하면서 생긴 공간이고 로컬과 분리된 독립적인 공간이다.
본론으로 돌아와서
backend라는 폴더가 backend라는 컨테이너에서 명령을 내릴때 사용 할 기본 작업 디렉터리 라고 알려주는것이다.
" ./ " 너는 누구냐..
# 현재 로컬 디렉토리에 있는 requirements.txt를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY requirements.txt ./
RUN pip install -r requirements.txt
./는 현재 빌드 컨텍스트(로컬에서 도커 빌드 명령을 실행하는 디렉토리)를 나타냄
기준은 도커컴포즈 파일이 있는 폴더가 기준이 됨
즉 현제 로컬에서 requirements.txt 파일이 있는 위치랑 도커컴포즈가 있는 위치랑 같다는 말임.
지금은 requirements.txt파일이 docker Compose랑 같은 경로에 있어서 위처럼 적었지만 예시로 docker Compose보다 한단계 위 혹은 아래에 있다고 가정하면.
COPY ../requirements.txt ./
COPY 하위디렉터리명/requirements.txt ./
backend파일을 컨테이너에 올리면 그 하위 내용도 따라와야하는거 아닌가?
# haruProject/ 디렉토리 전체를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/ .
# haruProject/.env 파일을 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/.env ./
도커는 명시적으로 무엇을 올릴지 말 안해주면 일을 안한다, WORKDIR에서 backend를 지정했지만 그 하위 폴더는 자동으로 등록이 안된다는 말이다.
haruproject를 copy함으로써 안에 있던 config, diary,guest,harucalendar,member,member,manage.py 전부다 넘어왔다.
.env, requirement.txt는 우리가 별도로 copy명령을 사용했기 때문에 넘어온것이다. 이 두개의 파일은 haruproject하위 파일들이 아니다.
.env파일은 보안때문에 원래 잘 포함시키지는 않는다.
.idea는 왜 넘어왔는지 이유를 모르겠다.
-> Dockerfile이나 Docker Compose 파일의 컨텍스트에 포함되어 있는 것일 수 있다.
FrontEnd
# Use the specified Node.js version
FROM node:18.12.1-alpine
# Set the user to root for necessary permissions
USER root
# Set the working directory inside the container
WORKDIR /frontend
# Copy the package.json and yarn.lock files first to leverage Docker cache
COPY package.json .
# Install dependencies
RUN yarn install
# Copy the entire project to the working directory
COPY . .
# Run the build command
RUN yarn build
NGINX
FROM nginx:1.21.3-alpine
RUN rm /etc/nginx/conf.d/default.conf
#도커 컨테이너 내부에 default.conf 파일을 삭제
COPY nginx.conf /etc/nginx/conf.d
#내 로컬에 있는 nginx.conf를 컨테이너 경로 /etc/nginx/conf.d 에 복사
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80