Docker многоступенчатая сборка - зачем встраивать docker? - PullRequest
0 голосов
/ 02 апреля 2020

Докер / java newb ie здесь. В это сделать c Я вижу:

Использовать многоступенчатые сборки. Например, вы можете использовать образ maven для создания приложения Java, затем сбросить его до образа tomcat и скопировать Java артефакты ...

Я понимаю, что мы использовать контейнеризацию, чтобы гарантировать, что среда выполнения приложения точно соответствует потребностям, но зачем нам также запускать сборку в контейнере? Разве не было бы достаточно иметь конвейер CI / CD, который

  • очищает кеш сборки, если / когда / где необходимо
  • просто запускает сборку снова
  • создает docker изображение с использованием новых артефактов?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

«Все как код» - это философия, которая рекомендует, чтобы мы все проверили в git, чтобы в случае бедствия (скажем, пандемия c, уничтожающего вашу рабочую силу ...), вы могли однажды восстановите все из вашего git репозитория и некоторых бинарных репозиториев, в которых хранятся используемые вами библиотеки. Под «всем» я имею в виду исходный код, систему сборки, все конвейеры и всю инфраструктуру.

Недостаточно поддерживать ваш исходный код в репо git, потому что, если он не ясен как это должно быть построено, тогда это имеет мало значения. Например, система 250klo c (тысяча строк кода) java может выглядеть так, как будто она будет компилироваться с java -8, но может быть некоторая логика c, которая работает только под java - 6. Вы предполагаете, что это java -8, потому что 250klo c - это слишком много кода, чтобы его можно было прочитать и понять, поэтому вы создаете и запускаете его, и он взрывается в работе, потому что вы использовали неправильный компилятор или другой дистрибутив Linux. Если вся ваша среда сборки также находится в коде и может быть легко воспроизведена, то этого не произойдет. Вы можете просто запустить docker image build --tag mycompany/myimage . (или, что еще лучше, использовать Makefile и просто запустить make), и все ваше приложение будет перестраиваться с использованием инструментов, предназначенных для первоначальных разработчиков.

Конечно, мы не Для того чтобы это было полезным, нужно прибегнуть к пандемии c. Попытка создать проекты с открытым исходным кодом без подробных инструкций - это PitA (Pain in the Ass), и даже с инструкциями может потребоваться вечность, чтобы найти нужные библиотеки и инструменты, загрузить их все и заставить их работать вместе. Эта проблема усугубляется, если вы не очень хорошо знаете набор инструментов (или вообще). Поместите инструкции по сборке в контейнер docker и boom - у вас есть сборочный проект, который почти тривиально построить с помощью тестируемого и исполняемого набора инструкций.

Этот шаблон настолько мощен, что в наши дни я собираю все в docker и включите Makefile, чтобы гарантировать, что даже команда docker выполняется так, как я планировал. Гораздо проще набрать make build, чем соответствующие команды docker. И все это посвящено git вместе с исходным кодом для моих проектов.

Причина, по которой мы используем многоэтапные сборки, заключается в том, что это проще, чем иметь несколько docker файлов, хотя в основном это одно и то же вещь, но с меньшими накладными расходами и меньшей вероятностью ошибок. Существуют многоэтапные сборки, так что вы можете включать компиляторы и аналогичные инструменты на этапе сборки и отбрасывать их в окончательном образе.

Одним из многих преимуществ этого подхода является то, что нам нужно только указать нашу процедуру сборки один раз, и он будет работать где угодно. При интеграции с инструментами непрерывной интеграции (CI) это избавляет нас от необходимости узнавать, как построить наше приложение с этим конкретным c инструментом, и избавляет нас от ошибок, возникающих, когда мы строим вещи в CI не так, как разработчики. Если вы используете контейнерную сборку, вам будет гарантировано, что разработчики и платформа CI одинаково работают одинаково, используя одни и те же инструменты, что помогает избежать ошибок класса «работает на моей машине». Это также ускоряет разработку ваших конвейеров, потому что вам нужно только сконфигурировать конвейер для запуска сборки docker (или, как упоминалось ранее, 'make'). Этот метод обеспечивает «повторяемость» вашей сборки (или, скорее, он должен обеспечить это, если все сделано правильно - все равно довольно легко ошибиться).

Я настоятельно рекомендую перейти на этот подход. как можно скорее. Это обязательный подход во всех крупных корпорациях, в которых я недавно работал (в основном в крупных европейских банках). Как только вы привыкнете к этому, предыдущие подходы кажутся в лучшем случае узкими, а в худшем - просто неправильными. Такой подход сэкономит вам много времени и усилий и приведет к созданию систем более высокого качества, которые намного проще в обслуживании, особенно в эти трудные времена.

1 голос
/ 03 апреля 2020

Если ваши артефакты сборки переносимы и вы не считаете среду сборки хоста обременительной, то нет ничего плохого в том, чтобы делать это так, как вы описываете. Если вы посмотрите на Java Docker вопросы по SO, почти у всех из них есть Dockerfiles, такие как

FROM openjdk:8-jre
COPY myapp.jar /
CMD ["java", "-jar", "/myapp.jar"]

В действительности есть два случая, когда я бы сказал, что вам следует предпочесть многоступенчатую сборку по сравнению с другими альтернативами. :

  1. Вы работаете на скомпилированном языке, который создает непереносимые двоичные файлы (C ++, Go, Rust) и не работает на нативном хосте - Linux; если вы создадите приложение внутри Docker, это будет та же ОС, что и возможная Docker среда выполнения.

  2. Вашему приложению нужны расширения, обычно написанные на C, для которых требуется полный набор инструментов для сборки, но не для запуска; например, интерфейс Python MySQL.

Если ваша система сборки достаточно стандартизирована и создает переносимый артефакт, сборка приложения на хосте и копирование его в образ просто хорошо. Java jar-файлы хорошо вписываются в этот шаблон; как и Javascript браузерные приложения, созданные через Webpack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...