amaslenn.github.com

View My GitHub Profile

Я и Docker

​ Наконец-то я добрался до 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.