Pull to refresh

Comments 14

--no-cache-dir — полезный флаг, который говорит pip не сохранять кэш скачанных пакетов. Это еще один способ уменьшить итоговый размер образа.

В современных докерфайлах вместо этого стоило бы подмонтировать /root/.cache/pip как слой кэша:

RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r requirements.txt

Кроме того, имеет смысл рассмотреть использование декларативного mopy вместо докерфайла.

для локальной разработки достаточно и кэширования слоёв; да и путь выглядит так, что под виндой ожидаем проблемы. в случае клауд билда - кэш всё равно пустой.

О каких проблемах под виндой речь? Путь-то указан строго внутри контейнера, а вопросы хранения снаружи полностью во власти BuildKit.

Отличная вводная статья, спасибо!

Хорошая статья для новичка, жаль, не попалась раньше, когда начинал ознакомление с докером.

Единственное, свежие версии 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 окружение, то не взлетит. Проверял.

Я к тому что нельзя прыгнуть выше окружения родительской системы.

Чушь. У контейнера своя корневая файловая система, в которой есть и окружение, и все нужные зависимости. Версия хостовой OpenSSL изнутри контейнера даже не видна.

Как невидимая библиотека может хоть на что-то повлиять?

С одной стороны вы в корне не правы, но как человек, который собирал питон до 3.13, openssl и sqlite для CentOS7, я понимаю вашу боль:)

Теперь мне надоело, и я перешёл на готовые сборки питона от astral (uv).

Пишу на Python любительски. Раньше все проекты были по принципу "запустить через команду python main.py", а тут понадобилось засунуть всё в docker из-за разных ОС при разработке и использовании. Очень полезная статься для меня. Спасибо. Особенно хорошо, что расписали так подробно, что происходит и Dockerfile.

Sign up to leave a comment.

Articles