Search
Write a publication
Pull to refresh

Comments 7

Создание requirements.txt

Добро пожаловать в 2025! У нас есть pyproject.toml.

Непонятно, на кого вообще эта статья рачситана. Кто разрабатывает внутри докер контейнера и чем вас не устраивают venv?

звон немножко в другом месте. такие системы очень удобны для разработчиков (фронтенд, бекенд) в случае когда у себя на компе надо развернуть всю систему, а ставить чужой стек неохота. например, зачем фронту ставить питон, а питонщику реакт или вуе. кстати,а ты сам при разработке где используешь бд - в докере или нативно?
я например,для своей команды настроил всё в докерах - и фронт,и бекенд и базы данных.причём благодаря томам фастпишник может писать код у себя в идешке, а результат видеть и в терминале и в браузере. а для фронтов это вообще замечательно - не надо ставить питон. к тому же всё это проксирую в нгинксе по доменам и работаем в https.
если у тебя есть готовое решение для командной работы - то вперёд, напиши статью, если вещь фирменная - возьмём

@Ryav 2025, середина. У меня пара сотен проектов, много докер файлов и практически ни одного toml. Или я что-то не то делаю, или не только через pyproject.toml можно вести разработку. Ну, к слову, правда, requrements.txt тоже стало меньше.

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:

может и мне подобную статью забабахать?

Sign up to leave a comment.

Articles