Образы Docker с помощью Puppet

docker-logo-loggedout

Не смотря на то, что в Docker hub’е достаточно много готовых образов у меня иногда возникает необходимость собрать свой с каким-то определенным набором приложений, настроек, блэкджеком и барышнями.

Более того, иногда бывает нужно создать сразу несколько образов. Например, для своего LAMP.

 

В принципе можно решать задачу в лоб – создавать контейнер из существующего образа, запускать с /bin/bash в качестве аргумента, ставить все нужное и делать commit. Иногда проделывать однотипные операции если собираешь похожие образы.

Docker может автоматически строить образы используя так называемые Dockerfile в котором помимо различных метаданных (базовый образ, автор), можно также указывать директивы RUN, котрой в качестве аргумента передаются команды, исполняемые во время создания образа. Например, apt-get update && apt-get install nginx.

 

В принципе и с Dockerfile можно жить, но работая с выделенными серверами и VPS поднакопилось достаточно много Puppet манифестов, которые грех было не использовать и с Docker-ом.

 

В принципе, идея достаточно простая:

  1. Берем базовый docker образ
  2. Устанавливаем puppet
  3. Копируем в контейнер наш манифест
  4. Запускаем puppet apply с этим манифестом

Так получается примерно такой Dockerfile:

...

Предполагается, в текущей директории находятся папки modules и наш основной манифест site.pp.

 

Сначала обновляется база apt, далее устанавливается репозиторий puppet и сам puppet. Чтобы проверить, что все установилось я использую параметр detailed-exitcoded с которым puppet информацию об ошибках передает посредством exit codes. Если код больше или равен 2 - что-то пошло не так и создание контейнера обрывается.

 

Имея такой простой и главное один Dockerfile в контейнер можно устанавливать чего угодно. Поставить тот же Bamboo c ProstgreSQL и Java одним класом :

 

Возможно для кого-то этот способ гораздо больший overkill чем установка руками, но такой подход тоже имеет место быть :)

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *