Comments 14
--no-cache-dir — полезный флаг, который говорит pip не сохранять кэш скачанных пакетов. Это еще один способ уменьшить итоговый размер образа.
В современных докерфайлах вместо этого стоило бы подмонтировать /root/.cache/pip как слой кэша:
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
Кроме того, имеет смысл рассмотреть использование декларативного mopy вместо докерфайла.
Отличная вводная статья, спасибо!
Хорошая статья для новичка, жаль, не попалась раньше, когда начинал ознакомление с докером.
Единственное, свежие версии docker compose запускаются командой docker compose , а не docker-compose
При локальной разработке после каждого изменения надо пересобирать образ? Кому будут принадлежать файлы, которые создаст запущенный скрипт (например логи или скаченные файлы)?
При локальной разработке после каждого изменения надо пересобирать образ?
Если его вообще использовать - то да. Но этот образ явно для прода, ну либо для фронтендера.
Для локальной разработки его всё ещё можно использовать, но придётся хитрить. Например, можно пробросить актуальные исходники внутрь через bind mount.
Кому будут принадлежать файлы, которые создаст запущенный скрипт (например логи или скаченные файлы)?
Логи должны писаться в stdout, а не в файлы. Демон докера их либо сохранит в формате json (по умолчанию), либо отправит куда настроили. Кстати, советую настроить отправку логов в journald, это поможет их сохранить при пересоздании контейнера.
"скаченные файлы" останутся в контейнере и будут удалены вместе с ним. Если это не устраивает - директорию с ними нужно монтировать либо с хоста, либо как том (volume).
Итак, у нас есть "стройматериалы" (наше Flask-приложение) и "завод" (установленный Docker). Теперь нам нужен "чертеж", по которому завод будет собирать наш продукт. В мире Docker этот чертеж называется
Dockerfile.
Gemini, это ты?
Хорошая статья, вводная. Но почему-то все забывают аспект ядра родительской системы.
Попробуйте собрать докера на CentOS7 (базовая версия) c python 3.11 и сервису который в докере нужен будет openssl версии выше чем есть в CentOS7
PS. Из исходников можно собрать и обновить CentOS7, но в статье допустим таких тонкостей нет.
Надо обязательно добавлять, то для сервиса в докере в любом случае требуется поддержка всех протоколов в ядре родительской системы.
Это вообще как?
openssl - клиентская библиотека, ей не требуется какой-то особой поддержки в ядре. Соответственно, и на хостовой системе никакого openssl не требуется, всё что нужно - наличие этого самого openssl в базовом образе.
Допустим CentOS7 и в ней OpenSSL1.x, никто не обновлял. Сервис написали так что требуется поддержка OpenSSL3 - точнее Python окружение, то не взлетит. Проверял.
Я к тому что нельзя прыгнуть выше окружения родительской системы.
С одной стороны вы в корне не правы, но как человек, который собирал питон до 3.13, openssl и sqlite для CentOS7, я понимаю вашу боль:)
Теперь мне надоело, и я перешёл на готовые сборки питона от astral (uv).
Пишу на Python любительски. Раньше все проекты были по принципу "запустить через команду python main.py", а тут понадобилось засунуть всё в docker из-за разных ОС при разработке и использовании. Очень полезная статься для меня. Спасибо. Особенно хорошо, что расписали так подробно, что происходит и Dockerfile.
Docker для Python-разработчика: как упаковать ваше приложение в контейнер и запустить где угодно