# syntax=docker/dockerfile:1
반드시 Dockerfile
첫 번째 줄에 적어야한다. Parser directive라고 표현하며 도커 빌더에게 도커 파일을 파싱할 때 어떤 문법으로 파싱해야하는지 알려주는 역할을 한다.
docker/dockerfile:1
은 항상 가장 최신의 version 1 syntax로 설정해주기 때문에 공식 문서에서 권장하고 있다.
FROM python:3.8-slim-buster
도커 이미지는 다른 이미지로 부터 상속받을 수 있다. 따라서 스스로 Base Image
를 구축하는 것보다 Official 하게 제공되는 Base Image
를 사용하는 것을 권장한다. 여기서는 Python 3.8 버전의 Base Image를 기준으로 예를 든다.
WORKDIR /app
Working Directory
를 설정하는 표현이다. 이것이 도커에게 default location으로 /app
을 사용하라고 알려주는 역할을 한다. 이렇게 함으로써 개발자들은 도커 파일을 작성하면서 Full Path
를 적어야하는 불편함을 방지할 수 있다.
COPY requirements.txt requirements.txt
도커 파일에 requirements.txt 라는 파일을 설치하는 명령을 적고 싶다면 해당 파일을 도커 이미지에 복사해주어야 한다. COPY를 하지 않는다면 이미지는 해당 파일의 위치를 알 수 없다.
COPY는 두 개의 파라미터를 가진다.
1. 이미지에 복사할 파일
2. 파일을 어디에 복사할지
따라서 위 명령은 "현재 폴더 밑의 requirements.txt를 이미지의 현재 폴더의 requirements.txt에 복사하겠다" 는 말이 된다.
RUN pip3 install -r requirements.txt
COPY
로 이미지에 requirements.txt
가 복사되고 나면 RUN
명령어로 pip3 install
을 실행할 수 있다.
명령어가 실행되면 이미지에 requirements.txt 내부에 있는 라이브러리들이 설치가 된다.
COPY . .
지금까지의 과정을 통해, 우리는 Python 3.8
버전의 이미지를 갖게 되었고 Dependencies를 설치 완료 되었다. 다음 단계는 우리의 전체 소스코드를 이미지에 쓰는 것이다. COPY 명령어를 사용하여 (. 은 현재 위치를 의미) 현재의 전체 코드를 복사하여 이미지에 넣어준다.
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]
마지막으로 우리가 해야할 일은 도커에게 이미지가 컨테이너 내부에서 실행되었을 때 어떤 명령어를 실행해야할지 알려주는 것뿐이다. CMD
명령어를 사용하여 터미널에서 사용하는 코드를 그대로 넣어주면 터미널과 동일하게 동작한다.
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]