все происходит следующим образом:
1. Пишется shiny приложение на Mac, тестируется и запускается прямо из RStudio
2. Формируется dockerfile, куда попадают необходимые библиотеки R
3. При сборке образа на Linux сервере может возникать ошибка о том, что нет какой то библиотеки, которую нужно добавить руками в dockerfile, бывает так, что это обнаруживается уже только при запуске контейнера и тестировании
4. Возврат на п.2 цикл пвоторяется пока все зависимости не будут указаны в dockerfile
Все это очень долго т.к. образ в каждый раз пересобирается заново. Есть ли какая-то более красивая практика определения зависимостей? При этом иногда речь идет о библиотеках linux, а иногда пакет, который вроде должен автоматом загружаться, что происходит скрыто при работе в RStudio (пакет даже не грузится в сессию) т.е. нехватку такого пакета получается отловить уже только на тестировании интерфейса (только что с ggpp такое было.
В докере можно папки перекидывать между образами. Грубо говоря, вы один раз компилируете все пакеты для R в тестовом образе и потом копируете их в основной. В основном образе просто ставится R и системные библиотеки, а все пакеты R копируются из тестового. Более-менее стабильно это работает, когда у вас конкретная версия R ставится и ОС одна и та же Конечно, если вам для приложения нужен N+1 пакет, то процедура повторяется. Но зато при пересборке докера не надо каждый раз все компилировать
Я в докере еще использовал пакет pak, он так красиво все в консоль репортил без лишних слов и все зависимости тоже сам подтягивал
https://arxiv.org/pdf/2103.08069.pdf https://www.rstudio.com/products/package-manager/ https://www.jumpingrivers.com/blog/faster-r-package-installation-rstudio/ в докерах можно по слоям раскидывать...
у меня как раз проблема в том, что хочется понять заведомо, что нужно для того чтобы успешно собрать и скомпилировать все пакеты
А посмотрите все же pak. Я понял, о чем вы говорите, но ни разу не пытался автоматизировать. https://cran.r-project.org/web/packages/pak/pak.pdf local_system_requirements - не то, случайно?
спасибо, я посмотрю
а что не сделать это на линуховой машине заранее? набор пакетов, как правило, достаточно устаканен. просто для публикации в прод постоянно использовать новые пакеты с новыми системными либами — такой себе подход. нет людей, которые все 10К пакетов использовали бы. пакетный хаос на проде — это, в первую очередь, административная проблема.
Логичнее делать свой репозиторий. Я такой делаю периодически (в конце месяца). Вместо установки всего. Плюс скачиваю системные либы под конкретный дистрибутив Линукса.
так вопрос в том, как заранее узнать, какие либы нужны, насколько я понял. ну т.е. можно, конечно, в error log смотреть, но это такое
Обычно нужны openssl, xml2 и подобные
один раз просто взять и поставить. пакеты все подскажут тупо до безобразия
а потом вы захотите поставить magick или rgl и УПС
Да, а потом написать баш скрипт.
Ничего страшного. Сразу из Синаптика вытаскиваем файлы установщиков.
.docker file
можно конечно и таким путем пойти т.е. брать чистую машинку linux и на на ней собирать все проблемы с установкой пакетов , но как -то громоздко
я не понял. Когда вы ставите R-овские пакеты, то зависимости между пакетами автоматически подтягиваются. Вопрос в том, как аналогично доустанавливать системыне либы. вот pak это вроде умеет делать
это только в теории громоздко. один раз сходите по пути, соберите себе свой .dockerfile и все.
да, вы правильно поняли
Когда Вас занесло в мир линуксов, системные функции грузятся из штатных репозиториев линуксов. Тогда приходится озаботиться еще и этим вопросом. Особенно в дебиане. Все же компилируется всю дорогу.
вы не понимаете задачу, как мне кажется. pak ставит линуксовые пакеты из штатных репозиториев с помощью execute. Т.е. вам не надо ДО установки пакетов ставить системные либы. Надо только проверить, нужны ли вашим пакетам какие-то системные зависимости и установить их до установки пакетов с помощью pak
у меня проекты слишком сильно отличаются и пакеты нужны очень разные: это не я такой, это жизнь такая )) т.е. я dockerfile сильно переписываю в каждый раз
в третьей ссылке есть раздел "Using Ubuntu Binaries" вопрос, а почему его бы не использовать? есть какие-то подводные камни?
оставить все что нужно и не переписывать. Не так уж много надо. Это только prophet гигабайты потребляет
камни есть везде. просто попробуйте в своем окружении.
ну вот я сегодня добавил leaflet, но тащить его в другой проект, где нет картографии - это не очень хорошо
играйте по-крупному, не мелочитесь. Вы тут штрихи подправляете, а там бигдата терабайтами кушает и не стесняется. пусть в пассиве на диске лежит — 1 Мб жалко? реально, проблема высосана из пальца. есть 100500 важных вопросов над которыми думать надо и стоит.
ну может и так))) хотя вариант с тем чтобы заведомо определить зависимости мне нравится больше, он как то больше согласуется с моим ощущением прекрасного
пишите прекрасный код — это мало кто умеет делать. пусть такси водят таксисты.
да я как раз не про код больше )) я больше про доказательство того, что идея работает или не работает
можно спутать чувство прекрасного с обычной прокрастинацией
Именно поэтому я задал вопрос уже когда все сделал чтобы не сбивать настрой
делайте большой докер файл, возвращайтесь к этому вопросу на следующем витке развития, решайте другие прикладные задачи. фокус на основном
оно может немного грубо, но стоит отделять важное от неважного. оценивать реальный вклад доработок в общий результат. devops — это непросто. там одним советом не обойтись. Если готовы вкачивать сотни человеко-часов — тогда стоит разбираться.
для меня devops - это третья важность, но в целом я удовлетворен дискуссией, как минимум стоит подумать о трех вещах: 1. использовать pak 2. использовать бинарники 3. откармливать свой "толстый" dockerfile от проекта к проекту ВСЕМ СПАСИБО 🙏
Обсуждают сегодня