Используйте многоступенчатые сборки Docker для разработки и развертывания R - PullRequest
7 голосов
/ 07 октября 2019

Проблема

  • Для разработки я хочу использовать образ Docker с RStudio IDE , который относительно тяжелый. Мне также нужно много пакетов для моего проекта, поэтому я создаю свой собственный файл Docker, на который есть вышеуказанное ссылочное изображение в операторе FROM. Давайте назовем этот новый Dockerfile Dokerfile.development.
  • . Для развертывания я хочу использовать base R image без IDE и столько зависимостей, сколько требуется для развертывания, с такой же настройкой, какв разработке, но без IDE, другие средства разработки и зависимости, необходимые для запуска тестов. Давайте назовем Dockerfile для деплимента Dockerfile.deployment.

Кандидатские решения

Итак, теперь я вижу следующие варианты создания этих двух изображений:

  • Один неэффективный способ сделать это - с / рвсе от Dokerfile.development в мой Dockerfile.deployment, но используйте r-base в выражении FROM. Недостаток: мне всегда нужно обновлять несколько файлов Docker. Если я добавлю другое изображение для тестирования, у меня будет 3 Dockerfiles с перекрытием 99%.
  • Другой способ - сначала создать Dockerfile.deployment со всеми требованиями для развертывания. Затем образ разработки создается поверх образа развертывания. Dockerfile.development более или менее соответствует инструкциям по установке в Dockerfile для образа RStudio для добавления RStudio в образ развертывания, но с изображением деплимента в качестве базового образа. Недостаток: я бы больше не понимал код в моих собственных файлах Docker.

  • Использование многоступенчатых сборок , которые облегчают извлечение встроенных исполняемых файлов (или вообще чего-либо) изодин образ и использовать его в другой, без необходимости копировать все зависимости, которые были необходимы для создания исполняемого файла. Поэтому моя идея состоит в том, чтобы извлечь соответствующие файлы из образа RStudio в новый образ, который будет моим образом развертывания.

Я думаю, что последний вариант предпочтительнее, потому что это наиболее модульное решение, с наименьшим дублированием в файлах Docker и наименьшей нагрузкой на обслуживание.

Вопрос

  • мой узкий вопрос: есть ли (один) исполняемый файл, который я мог бы извлечь из образа сборки RStudio и поместить его поверх моего образа развертывания?

  • Мой более открытый вопрос: как люди справляются с ситуацией, когда образ разработки представляет собой образ развертывания, а также некоторые другие инструменты, которые доступны как автономные образы, и они хотят избежать дублирования, как показано в двух первых решениях в разделе Возможные решения .

1 Ответ

2 голосов
/ 14 октября 2019

tl; др: Вы не можете. В том, как вы спрашиваете, я думаю. Может быть, вы можете сделать это по-другому.

Более длинная версия:

  • Не воспринимайте это как бойкий ответ.
  • Я думаю, что доходит до сути того, как мы упаковываем исходный код
    • , беря исходный код из репозиториев
    • или принимая двоичные агрегации, например как .deb файлы
    • или бинарные метаагрегации, здесь слои Docker
  • Вы понимаете, что существуют слои Docker, содержащие компоненты
  • Если я правильно прочитал ваш запрос,Вы хотите «перевернуть» один слой
  • , т.е. извлечь часть RStudio из док-станции RStudio
  • Я думаю, что вы не можете
  • По сути, контейнер RStudio Docker просто распаковывает.deb они поставляют
  • Так что вы должны перевернуть весь свой стек
  • Начать с r-ver или r-base, добавить ваши конкретные потребности в разработке
  • Затем добавьте RStudio .deb, как мы делаем в контейнере RStudio
  • (Legalese: у нас есть явное разрешение на его распространение, я сомневаюсь, что это транзитивно)

Надеюсь, это поможет. Заполните все пробелы, где я неправильно понял свои предположения.

...