Наконец-то я добрался до docker’а. Очень давно хотел понять, что ж это за зверь такой и как я могу его использовать. Чтобы совместить приятное с полезным, решил настроить GitLab сервер с его CI. У ребят как раз есть и сервер и Runner’ы, аккуратно упакованные в контейнеры и выложенные в dockerhub.
Нууу, с самим сервером проблем не возникло. Только порт для ssh
перенастроил и все завелось. От docker’а тут только его установка и была, все остальное тщательно скопировано из руководств гитлаба. Счастье, чо.
Самое интересное началось с Runner’ом. Дефолтный меня, само собой, не устраивал, мне для моих экспериментов нужен Perl 5.22, а на машине только 5.18 был. Решение тут известное – perlbrew.
Промучившись с запуском одиночных команд, освоил вход в контейнер docker exec -it gitlab/gitlab-runner bash
. Я рут! В самом контейнере! Могу делать все, что захочу! Поставил, настроил, вышел. Теперь docker commit <sha-1> gitlab/gitlab-runner:my
и все сохранено.
Но вот мой CI не работает, перл используется системный. Что не так? Ага, делал я все под рутом, а гитлаб использует gitlab-runner
. Вот ведь, придется еще раз все повторить.
Итак, perlbrew
по умолчанию ставится в домашнюю директорию пользователя. В docker’е раннера домашняя директория отмечена как VOLUME
. Все мои попытки закоммитить эти изменения были напрасны. Я уже даже подумал, что коммит - это слишком сложно для меня. Но надо просто читать документацию. То, что все изменения директории после директивы VOLUME игнорируются, написано и в референсе по командам, но довольно вскользь. А я чего уж только не делал…
Казалось бы, теперь вот точно счастье, но и тут не случилось. Перл упорно берется системный. По каким-то причинам docker использует non-login shell
(я вот даже понятия о таком не имел), что означает полное игнорирование всевозможных ~/.profile
и ~/.bashrc
. И все. Настраивай юзера, не настраивай юзера, все едино. Люди тоже сталкиваются с этим и тоже не рады.
Мое решение довольно тупое и прямолинейное, добавляю файл /usr/local/bin/perlbrew
:
export PERLBREW_HOME=/home/gitlab-runner/perl5
source /home/gitlab-runner/perl5/perlbrew/etc/bashrc
exec /home/gitlab-runner/perl5/perlbrew/bin/perlbrew $@
Контейнет, само, собой, сохраняю после этого. Теперь это бинарь доступен всем, кто может читать домашнюю директорию gitlab-runner
. Можно было бы поставить perlbrew
в отдельную директорию и дать на нее всем права, но для моих нужд это не принципиально.
В итоге, свое знакомство с docker’ом считаю состоявшимся. Технология, безусловно интересная, причем не только для далеких от меня “серверных решений”. Есть пара идей, где docker мне может очень пригодится, но не факт, что дойдут руки.
… дошли :)
Теперь я счастливый обладатель репы на dockerhub. И у меня там целый один (1!) контейнер с настроенным окружением для GitHub Pages + jekyll.