Docker контейнер с PHP и Apache на основе Gentoo

· автор BaRoN · На чтение уйдёт 3 минут · (623 слов)

Как говорится, нет покоя стебанутым. И даже несмотря на то, что и на работе, и дома у меня сейчас используется вовсе не Gentoo, а ArchLinux, а ещё на работе в LXC-контейнерах используется Funtoo, я замыслил недоброе: маленький контейнер с Apache и mod_php на основе Gentoo. Небольшой список часто задаваемых вопросов и ответов, которые на самом деле никто мне вообще не задавал, а я сам их только что выдумал, сам ответил и сам молодец:

  • В: Набуя?
  • О: Надо по работе.

  • В: Как вообще дошло до жизни такой?

  • О: Поставлена задача сделать образ на основе PHP 5.6, а в Ubuntu LTS, которую мы использовали, было 5.5. К тому же, я не люблю Ubuntu.

  • В: Почему Apache?

  • О: 1) legacy 2) mod_rewrite.

  • В: Почему PHP?

  • О: 1) legacy 2) BDSM.

  • В: Почему Docker?

  • О: Потому что я могу.

  • В: Почему Gentoo?

  • О: Потому что я могу.

  • В: Но в Gentoo же куча ненужного фекального говна?

  • О: Образы собираются минимальные, без gcc, блэкджека и куртизанок

Вообще, в мире Docker, есть, я бы сказал, несколько стандартов «де-факто»: 1. busybox, с ним всё и так понятно. Когда не нужно вообще ничего, кроме готового бинарника (привет, Go!) 2. Ubuntu, с ним тоже всё понятно. Куда ж нынче без Ubuntu. Как говаривал старик Жириновский — тут Ubuntu, там Ubuntu, везде Ubuntu. 3. Debian, на котором основывают свои образы (обычно) мои соратники-убунтофобы. Как известно, все мы латентные убунтолюбы, просто свою любовь тщательно скрываем. И вообще, один раз не убунтолюб. 4. CentOS, с которым вообще всё непонятно. Большой, древний, неповоротливый, но у него есть преданные фанаты.

Вот мы решили выпендриться, и перевестись с ubuntu:latest на gentoo. Почему не на Alpine? В ЧАВО такого не было, так что думайте сами :D

В помощь мне оказался немец, который делает проект gentoo-bb, я основывался на его образах. Насколько я могу судить, идея предельно проста и элегантна. Сначала собирается базовый образ Gentoo, на основе stage3. Уже от него наследуется образ-сборщик (в котором установлен gcc и компания), и образ-цель, в который поступает из образа-сборщика только лишь собранный пакет. В итоге и всё довольно быстро происходит, и без мусора. Красота-то какая! Лепота!

Итак, вкратце опишу ход моих действий. В первую очередь нам понадобятся стандартные сборщики gentoo-bob, gentoo-bob-musl и т.п. Поэтому я просто запускаю build.sh, и начинаю разработку. Нам понадобится создать пространство имён bytex, для этого я создаю каталог bytex внутри dock. Наши образы начинаются с bytex/, чтобы ни с кем не перепутать :). Все дальнейшие повествования относятся к тому, что происходит внутри каталога gentoobb/dock/bytex. Добавим в images новый каталог apache-php56. Сделаем в нём конфиг Buildconfig.sh. Вот его содержимое:

PACKAGES="dev-lang/php:5.6"

configure_bob() {
    echo CONFIGURE BOB
    mkdir -p /etc/portage/package.{accept_keywords,unmask,mask,use}
    update_use 'dev-lang/php' '+apache2 +mysql +mysqli'
    update_use 'app-eselect/eselect-php' '+apache2'
}

Прерываем сборку в первой вкладке, и уже начинаем сборку пространства имён bytex:

./build.sh -s build bytex   

Сборка может продолжаться несколько часов, т.к. хотя собирается и, гм, несколько обрезанная Gentoo, но собирается она «с нуля». Впоследствии будет использоватся кэш пакетов, будет попроще. С этим я уже столкнулся, когда выполнял пересборку образа. Работа, к сожалению, продвигается очень медленно, только когда на работе нет других,более важных дел. Обычно это выглядит примерно так: я что-то небольшое сделаю, и запускаю пересборку, возвращаясь к результатам через несколько часов. Так или иначе, первые эксперименты уже закончены и не совсем стыдно выложить самую первую версию на публичное обозрение: https://github.com/bytex/gentoo-bb

Основные отличия от оригинала: более свежая версия stage3, работает только на процессорах Intel Haswell или более новых, адаптирован для российских, а не немецких серверов. Ну и да, конечно, внутри есть пакет bytex/apache-php56. Не протестированный, но должен в принципе работать. Использовать его «как есть» крайне не рекомендуется, от него надо наследоваться и добавлять всяческие свои полезные штуковины.

Пост писался неспеша на протяжение трёх дней, если чего не так — извиняйте. Продолжение следует, когда доведу образ до ума, протестирую и залью в Docker Hub.

Полезное