Every Build in Its Own Docker Container

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Docker - это инструмент командной строки, который может запускать команду оболочки в виртуальной системе Linux в изолированной файловой системе. Каждый раз, когда мы собираем наши проекты, мы хотим, чтобы они работали в своих собственных контейнерах Docker. Возьмем, например, этот проект Maven:

Эта команда запустит новую систему Ubuntu и выполнит внутри нее mvn clean test. Rultor.com, наш виртуальный помощник, делает именно это с нашими сборками, когда мы их развертываем, упаковываем, тестируем и объединяем.

Какие преимущества это дает нам? И почему Docker, когда есть много других технологий виртуализации, например, LXC?

Ну, есть несколько очень важных преимуществ:

  • Versioning

  • “Application-centric” - “Ориентированный на приложения”

Давайте обсудим их подробнее.

Docker позволяет обмениваться образами через свой общедоступный репозиторий на hub.docker.com. Это означает, что после того, как я подготовлю рабочую среду для своего приложения, я создаю из нее образ и загружаю его на хаб.

Предположим, мне нужно выполнить сборку Maven в контейнере с предустановленным пакетом graphviz (чтобы включить инструмент командной строки dot). Сначала я запускаю обычный контейнер Ubuntu и устанавливаю в него graphviz.

У меня есть контейнер, который остановился несколько секунд назад. ID контейнера - 215d2696e8ad. Теперь я хочу сделать его многоразовым для всех последующих тестов на Rultor.com. Мне нужно создать из него образ.

Я только что сделал новый коммит в новое изображение yegor256/beta. Это изображение можно использовать прямо сейчас. Я могу создать новый контейнер из этого изображения, и внутри него будет установлен graphviz!

Теперь пришло время поделиться моим изображением на Docker Hub, чтобы оно стало доступным для Rultor:

Последний шаг - настроить Rultor для использования этого образа во всех сборках. Для этого я отредактирую .rultor.yml в корневом каталоге моего репозитория GitHub.

Вот и все. Теперь Rultor будет использовать моё собственное Docker-изображение с предустановленным graphviz в каждой сборке (слияние, релиз, развертывание и т.д.).

Кроме того, если и когда я захочу добавить что-то еще в изображение, это легко сделать. Например, я хочу установить Ruby в мое сборочное изображение. Я запускаю контейнер из изображения и устанавливаю его (обратите внимание, что я запускаю контейнер не из образа ubuntu, как делал раньше, а из yegor256/beta).

Теперь вы можете видеть, что у меня есть два контейнера. Первый из них - тот, который я использую прямо сейчас; в нем содержится Ruby. Второй - тот, который я использовал раньше, и в нем содержится graphviz.

Теперь мне нужно снова закоммитить и запушить:

Таким образом, Docker Hub является очень удобной функцией для Rultor и подобных систем.

Как вы видели в приведенном выше примере, каждое изменение образа Docker имеет свою собственную версию (хеш) и возможность отслеживать изменения. Также возможно откатиться к любому конкретному изменению.

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

Docker, в отличие от, например, LXC или Vagrant, ориентирован на приложения. Это означает, что когда мы запускаем контейнер - мы запускаем приложение. С другими технологиями виртуализации, когда вы получаете виртуальную машину - вы получаете полностью функциональную среду Unix, где вы можете войти через SSH и делать все, что хотите.

Docker упрощает все. Он не предоставляет вам доступ по SSH к контейнеру, но запускает приложение внутри и показывает вам его вывод. Это именно то, что нам нужно в Rultor. Нам нужно запустить автоматическую сборку (например, Maven или Bundler), увидеть ее вывод и получить код завершения. Если код не равен нулю, мы отменяем сборку и сообщаем пользователю.

Вот как мы запускаем сборку Maven:

Как видите, Maven запускается сразу. Мы не беспокоимся о внутреннем устройстве контейнера. Мы просто запускаем приложение внутри него.

Более того, благодаря опции --rm, контейнер уничтожается сразу после завершения выполнения Maven.

Вот что означает ориентированность на приложения.

В целом, наше впечатление от Docker’a очень положительное.

пс. Компактная версия этой статьи была опубликована на devops.com

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-16 at 15:35

sixnines availability badge   GitHub stars