Comments 7
Создание requirements.txt
Добро пожаловать в 2025! У нас есть pyproject.toml.
Непонятно, на кого вообще эта статья рачситана. Кто разрабатывает внутри докер контейнера и чем вас не устраивают venv?
звон немножко в другом месте. такие системы очень удобны для разработчиков (фронтенд, бекенд) в случае когда у себя на компе надо развернуть всю систему, а ставить чужой стек неохота. например, зачем фронту ставить питон, а питонщику реакт или вуе. кстати,а ты сам при разработке где используешь бд - в докере или нативно?
я например,для своей команды настроил всё в докерах - и фронт,и бекенд и базы данных.причём благодаря томам фастпишник может писать код у себя в идешке, а результат видеть и в терминале и в браузере. а для фронтов это вообще замечательно - не надо ставить питон. к тому же всё это проксирую в нгинксе по доменам и работаем в https.
если у тебя есть готовое решение для командной работы - то вперёд, напиши статью, если вещь фирменная - возьмём
requrements.txt мне на нравтся одним - там нет дерева зависимостей. если я по ошибке поставил какойнибудь пакет,а он за собой потянул ещё несколько, то непонятно, что удалять. вроде uv показывает зависимости, но не уверен,не использовал
Мне кажется, зря вы спорите. У обоих инструментов есть своя ниша. Toml вмести с poetry/uv удобнее для разработки. Контроль дерева, разделение dev зависимостей, удобные настройки линтеров и т.д. Requirements в свою очередь удобнее для деплоя создана файл с нужными версиями пакетов без дев зависимотей. Понятно что можно добавить poetry в контейнер, но это странно. Тогда уж надо multi stage build делать, но это зачастую лишнее усложнение dockerfile.
у автора немного сумбурный порядок изложения, но в целом подход нравится. плюсанул. молодец
из замечаний
1) docker run --name fastapi-container -p 80:80 -d -v $(pwd):/code fastapi-image что это за извращение? в волумес можешь поместить всю папку с фастапи. и таким образом всё что пишешь в идешке - отражается и в докере - фастапи в контейнере перезагружается, а логи ты видишь в терминале идешки. если у тебя несколько контейнеров, и они засирают терминал, то этой командой docker logs -f <имя контейнера> можешь видеть логи нужного тебе контейнера в текущем времени
2) для уменьшения объёма контейнера советую в докере установить облегчённую версию питона,поставить на неё зависимости, а потом установить новый образ а зависимости ставить из старого
FROM python:3.13-slim AS builder
WORKDIR /install
RUN apt update && apt install -y build-essential
COPY requirements.txt .
RUN pip install --upgrade pip &&
pip wheel --no-deps --wheel-dir /wheels -r requirements.txt
RUN useradd -m myuser
USER myuser
FROM python:3.13-slim
ENV PYTHONDONTWRITEBYTECODE=1
PYTHONUNBUFFERED=1
WORKDIR /backend
Добавляем самоподписной сертификат в доверенные
RUN apt-get install -y ca-certificates &&
update-ca-certificates
RUN apt update && apt-get install -y curl grep
Копируем wheels и устанавливаем зависимости
COPY --from=builder /wheels /wheels
COPY requirements.txt .
RUN pip install --no-deps --no-index --find-links=/wheels -r requirements.txt
--no-deps: Не устанавливает зависимости пакетов, только те, что перечислены в requirements.txt.
--no-index: Не использует PyPI или другие индексы , т.е. не будет скачивать пакеты из интернета.
--find-links=/wheels: Ищет пакеты локально в директории /wheels , где должны лежать .whl (wheel) файлы.
-r requirements.txt: Указывает список пакетов для установки.
--no-cache-dir: Отключает кэширование загруженных пакетов. Это может быть полезно, чтобы уменьшить размер образа Docker.
COPY . .
ENTRYPOINT ["sh", "-c", "
if [ "$PROFILE" = "1" ]; then
python -m cProfile -o output.prof runserver.py;
else
uvicorn app.main:app --host 0.0.0.0 --port 8000
--ssl-keyfile /usr/local/share/ca-certificates/tls.key
--ssl-certfile /usr/local/share/ca-certificates/tls.crt
--reload;
fi"]
3) не забываем про хеалсчеки, зависимости и порты
одно из решений
depends_on:
db:
condition: service_healthy
healthcheck:
test: [ "CMD", "sh", "-c", "curl -sk https://localhost:8000/health_check/ -o /dev/null -w '%{http_code}' | grep -q '200' || exit 1" ]
interval: 5s
timeout: 5s
retries: 10
networks:
devops_mynetwork:
ipv4_address: 172.20.0.12
зайди в контейнер и проверь,как отработал хеалсчек
если тебе не надо открывать порт наружу, используй expose: вместо ports:
если в контейнере надо внести запись в hosts, то есть extra_hosts:
может и мне подобную статью забабахать?
Настройка среды разработки: VSCode, Docker для Python-проектов. Debug внутри контейнера