Комментарии 7
Два вопроса знатокам Python + Docker:
— Зачем в примере нужны промежуточные образы, если Docker и так кэширует слои?
— Можно ли (и как) упаковать в образ прекомпилированные файлы (.pyc) чтобы не тратить время при каждом запуске контейнера и не создавать ad-hoc слой
— Зачем в примере нужны промежуточные образы, если Docker и так кэширует слои?
— Можно ли (и как) упаковать в образ прекомпилированные файлы (.pyc) чтобы не тратить время при каждом запуске контейнера и не создавать ad-hoc слой
2) Возможно, поможет
python -m compileall
: compileall — Byte-compile Python librariesМожно пользуясь случаем дозадать вопросы?
- Кто использует подобную автоматизацию и докеризацию в проде, как вы боретесь с тем, что большинство докерфайлов протухают через пару месяцев. (У сырцов urlы меняются, у пакетов версии меняются и т.д.). Как только вывалилась ошибка при билде начинается ручной разбор полётов — что там в интернете на этот раз обновилось?
- Зачем создавать виртуальную python среду в контейнере, который рожден чтобы обслуживать одно единственное python приложение? Почему нельзя использовать системный python (экономя при этом на размере, ибо venv частично делает копии библиотек у себя в рабочем каталоге).
PS а что касается
Зачем в примере нужны промежуточные образы, если Docker и так кэширует слои?
Насколько мне хватает знаний, в контексте данного примера (если мы всегда используем только докерфайл из статьи) — бессмысленная операция. Возможно это задел на будущее в рабочей среде автора статьи. Чтобы можно было пересобирать образы с определенного чекпоинта (образа), а не с самого начала.
По поводу «протухания» — такое действительно случается. Но статистически — либо вы сервис не трогаете (пользуясь собранным ранее образом), либо что-то меняете — тогда все равно приходится тесты гонять и бОльшая часть проблем выявляется еще у девелоперов.
В особых случаях (типа TensorFlow или numpy для RaspberryPi, строящихся по пол-дня — или каких-то редких драйверов) мы хранили wheels нужных версий.
В особых случаях (типа TensorFlow или numpy для RaspberryPi, строящихся по пол-дня — или каких-то редких драйверов) мы хранили wheels нужных версий.
Зачем создавать виртуальную python среду в контейнере, который рожден чтобы обслуживать одно единственное python приложение? Почему нельзя использовать системный python (экономя при этом на размере, ибо venv частично делает копии библиотек у себя в рабочем каталоге).
Там два разных базовых образа — для тестера и для раннера. И venv копируется с тестера в раннер:
# dev.Dockerfile
FROM python:3.8.1-buster AS builder
…
FROM builder AS builder-venv
…
FROM builder-venv AS tester
…
FROM martinheinz/python-3.8.1-buster-tools:latest AS runner
COPY --from=tester /venv /venv
COPY --from=tester /app /app
я так понимаю, что с промежуточными слоями мы избавляемся от артефактов сборки в образе.
Например, пип кеширует скачанные файлы, и вот этот кэш останется в билд-образе, а в рабочий образ пойдёт только venv. Ну или если какая-то либа собиралась из исходников, то ошмётки её билда тоже не нужны.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Автоматизация работы с проектом Python