Pull to refresh

Comments 7

Два вопроса знатокам Python + Docker:
— Зачем в примере нужны промежуточные образы, если Docker и так кэширует слои?
— Можно ли (и как) упаковать в образ прекомпилированные файлы (.pyc) чтобы не тратить время при каждом запуске контейнера и не создавать ad-hoc слой

Можно пользуясь случаем дозадать вопросы?


  1. Кто использует подобную автоматизацию и докеризацию в проде, как вы боретесь с тем, что большинство докерфайлов протухают через пару месяцев. (У сырцов urlы меняются, у пакетов версии меняются и т.д.). Как только вывалилась ошибка при билде начинается ручной разбор полётов — что там в интернете на этот раз обновилось?
  2. Зачем создавать виртуальную python среду в контейнере, который рожден чтобы обслуживать одно единственное python приложение? Почему нельзя использовать системный python (экономя при этом на размере, ибо venv частично делает копии библиотек у себя в рабочем каталоге).

PS а что касается


Зачем в примере нужны промежуточные образы, если Docker и так кэширует слои?

Насколько мне хватает знаний, в контексте данного примера (если мы всегда используем только докерфайл из статьи) — бессмысленная операция. Возможно это задел на будущее в рабочей среде автора статьи. Чтобы можно было пересобирать образы с определенного чекпоинта (образа), а не с самого начала.

По поводу «протухания» — такое действительно случается. Но статистически — либо вы сервис не трогаете (пользуясь собранным ранее образом), либо что-то меняете — тогда все равно приходится тесты гонять и бОльшая часть проблем выявляется еще у девелоперов.
В особых случаях (типа 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. Ну или если какая-то либа собиралась из исходников, то ошмётки её билда тоже не нужны.

Sign up to leave a comment.