За основу возьмем простой проект по типу "Hello word". Для этого создадим файл main.py следующего содержания:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def welcome() -> dict:
return {"message": "Hello World"}
И следующим шагом выполним команду:
pip freeze -> requirements.txt
Чтобы создать файл, содержащий все зависимости нашего проекта.
Создание Dockerfile
Начнем с Dockerfile - это текстовый файл, который содержит инструкции о том, как будет создан docker-образ.
В Dockerfile используются нижеследующие директивы:
FROM: Директива устанавливает базовый образ, из которого будет построен контейнер Docker.
WORKDIR: Директива устанавливает рабочий каталог в созданном образе.
RUN: Директива выполняет команды в контейнере.
COPY: Директива копирует файлы из файловой системы в контейнер.
CMD: Директива устанавливает исполняемые команды в контейнере.
В корневом каталоге проекта создайте файл с именем Dockerfile без расширения файла:
Добавим в этот файл следующие команды:
# pull the official base image
FROM python:3.12.0-alpine
# set work directory
WORKDIR /usr/src/app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app
RUN pip install -r requirements.txt
# copy project
COPY . /usr/src/app
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
Разберем содержимое этого файла подробнее:
FROM python:3.12.0-alpine: Устанавливает базовый образ, из которого будет создан контейнер Docker.
WORKDIR /usr/src/app: Устанавливает рабочий каталог внутри контейнера в/usr/src/app.
ENV PYTHONDONTWRITEBYTECODE 1: Не позволяет Python копировать файлы.pycв контейнер.
ENV PYTHONUNBUFFERED 1: Гарантирует, что вывод Python регистрируется в терминале, что позволяет отслеживать логи FastAPI в режиме реального времени.
RUN pip install --upgrade pip: Устанавливает и обновляет версию pip, которая находится в контейнере.
COPY ./requirements.txt /usr/src/app: Копируетrequirements.txtфайл в рабочий каталог в контейнере.
RUN pip install -r requirements.txt: Устанавливает все необходимые модули проекта для запуска в контейнере.
COPY . /usr/src/app: Копирует весь исходный код проекта в рабочий каталог в контейнере.
EXPOSE 8000: Предоставляет порт8000для доступа из других приложений.
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]: Устанавливает исполняемые команды в контейнере.
Создание образа Docker
Чтобы создать образ Docker из файла Dockerfile, который мы создали выше, выполните следующую команду:
docker build --tag fastapi_hello_word:latest .
--tagУстанавливает тег для образа. Например, мы создаем образ Docker изpython:3.12.0у него есть тегalpine.
В нашем образе Docker,latestэто тег.
- Точка
.указывает на то, чтоDockerfileнаходится в текущем рабочем каталоге.
Результат выполнения данной команды:
Чтобы перечислить все доступные образы на вашем компьютере, выполните следующую команду:
docker image ls
Также мы можем посмотреть наши образы используя Docker Desktop, перейдя в раздел Images:
Из приведенного выше списка мы видим созданный нами образ fastapi_hello_word.