понимаю, что если я буду использовать докер, то необходимость виртуальных окружений virtualenv отпадает?
virtualenv скорее не нужен почти никогда, venv все ещё может быть удобен. Например, в случае multistage сборки
да, я venv имел ввиду. Тот, что по стандарту идет. А зачем в многоэтапных сборках он?
Скопировать из одного в другой
а venv как в этом поможет?
Чтобы не ставить зависимости дважды
так можно же в конце просто поставить зависимости и все? Или я по-ходу не очень понимаю что такое мультиэтапная сборка? Там же ее как угодно можно кастомизироать, нет?
Собственно, мультистейдж для того и делается, чтобы сформировать нужные зависимости и не тащить за собой средства сборки.
Да, что такое по твоему многоэтапная сборка?
Зависит от ситуации. Если тебе на каждый стрйдж нужны разные депенденси или последний стрйдж не зависит от остальных - ок Иначе - зачем каждый раз ставить зависимости? Или например комуляция зависимостей
ну, это когда в рамках одного контейнера несколько разных образов может использоваться? Но можно же в конце просто установить все зависимости?
Ээээ. Не совсем. Скорее нет чем да
ну как минимум это череда команд, которая в конечном счете должна привести к успешной сборке, хотя, наверное, это обычная сборка 🤔
Это ты описал сборку имеджа в общем ))
ну да. Ну тогда, возможно, сборка нескльких проектов в рамках одного контейнера?
Давай решим вопрос с дефинициями. Дай дефиниции: Имеджу, контейнеру, проекту, зависимостям и сборке
имидж это как репо на гитхабе, просто код, который потом будет запущен Контейнер это как сервак один Проект это один репозиторий, например Зависимость это сторонние библиотеки от которых зависит проект Сборка это установка этих зависимостей
Зайдём с другой стороны. Процесс сборки приложения на каком-нибудь Си или ещё чём компилируемом представляешь? В курсе, что там несколько этапов?
Как связан контейнер и имадж?
Не заметил вопрос, сорян
ну там просто добавляется ещё команда компиляции вроди как да ивсе
так имедж описывает, что нужно предустановить на серваке по окружению, возможно даже не связанному с питоном
Нет, я о том, что при компиляции сколь-нибудь сложной программы на условном Си мы не получаем одной командой сразу конечный исполняемый файл, сначала создаются объектные файлы, потом они как-то там линкуются, собираются в кучу и т. п. Для всего этого нам могут быть нужны какие-то заголовочные файлы и ещё миллион всего. А в итоге для запуска готовой программы нам нужен один бинарник и может немного либ, а исходники, заголовки, компилятор, и прочая фигня — не нужны. Так вот, мультистейж позволяет нам в процессе сборки зафиксировать какое-то состояние, поставить компилятор, что нам там ещё надо, собрать всё, получить готоврый к работе результат в папочке и забрать с собой. Потом начать заново с сохранённой точки и принести в финальный образ только нужное, а не весь зоопарк. С питоном можно делать примерно такое же.
окей, можно привести пример на питоне когда может возникнуть подобный зоопарк?
Компилятор сишных пакетов все ещё нужен бывает
Собственно, совсем не все пакеты питона написаны на питоне, иногда они точно так же тащатся из исходников. Ещё мы можем во время сборки прогонять какие-нибудь тесты, порождающие файлы, и нам они нафиг не нужны в продакшене. Ну и такого рода ситуации могут всплывать по разным причинам.
Ну все остальное кроме того, что не все зависимости могут быть связаны с питоном, я бы причислил к обычной сборке, нет?
Не понял фразу. Речь о том, что у тебя в процессе сборки могут появляться полуфабрикаты, не нужные для работы конечного образа. В некоторых случаях можно выкинуть их из образа таким вот способом.
так удаление ненужных файлов вроди как входит в этап сборки, нет?
мы немного отдалились от темы вообще. Мы начали с смысла использования venv при использовании докера
Ну, во-первых, правильно удалить ещё заморочиться надо, чтобы всё найти. А во-вторых, ты в курсе, что образ - это набор слоёв и что удаление в новом слое не освободит место в предыдущих?
В слоях останутся
аа, я по-моему начинаю понимать. Вы имеете ввиду что слои для того, чтобы быть самодостаточными, могут содержать кучу информации, которая будет так же и в других слоях и чтобы избежать этого и сэкономить место на диске, нужно в ручную удалять всё это? Вот, допустим, одна и та же питоновская библиотека может быть установлена 2 раза? В итоге что, venv помогает исключительно в том, что все питонвоские зависимости будут установлены в одну папку, в которой более ли менее просто что-то найти и удалить?
На место на диске в целом пофиг, хотя если у тебя образы собираются сотнями а то и тысячами, это может быть важно. А вот тащить много-гигабайтный образ по сети каждый раз такое себе удовольствие.
ок, так а с venv-то это как связано?
Копируя venv в финальный стейдж ты копируешь только нужные пакеты, а не тащишь за собой все барахло используемое при сборке.
Можешь посмотреть пример мультистейдж билда https://gist.github.com/cutwater/91eca07eab6cd824cfdd60f462ea9fa8
я так понял, вот это ключевая строчка? COPY --from=build /venv /venv То есть смысл в том, чтобы копированием одной папки из слоя в слой переносить зависимости? А не скачивать их по-новой при запуске каждого слоя?
> То есть смысл в том, чтобы копированием одной папки из слоя в слой переносить зависимости? Не зависимости, а прямо все приложение целиком вместе с зависимостями. > А не скачивать их по-новой при запуске каждого слоя? ШТА? Что такое "запуск слоя" ?
ЧОБЛЯ?
ну имидж может состоять же из нескольких слоев, нет?
Да, и? При чем тут запуск контейнера?
ну запуск контейнера это запуск кода из имиджа же
ну это означает, что слой за слоем будет запущен, нет?
Схуяли? Как ты пришел к этому оригинальному выводу. Что такое "запуск слоя" ?
Он пишет не на python
А на питоне
https://github.com/wagoodman/dive Можешь попробовать посмотреть что там под капотом происходит. Многие вопросы отпадут
Обсуждают сегодня