19.02.2019, 16:53
(
Last edited by SHOROOP; 20/02/2019 at 10:41 AM.
)
Всем привет. Меня давно тут не было, меня мало кто вспомнит, но тем не менее.
Использовать docker-контейнеры на продакшене сейчас модно - удобно поддерживать, удобно разворачивать, удобно передавать. В своей работе пришлось столкнуться с задачей обернуть стандартный samp03svr в контейнер. Чужих реализаций не искал (вернее, посмотрел потом, все равно не устроили), сделал свою.
Что нужно для запуска:
Использовать docker-контейнеры на продакшене сейчас модно - удобно поддерживать, удобно разворачивать, удобно передавать. В своей работе пришлось столкнуться с задачей обернуть стандартный samp03svr в контейнер. Чужих реализаций не искал (вернее, посмотрел потом, все равно не устроили), сделал свою.
Что нужно для запуска:
- понимать, что такое docker и зачем он нужен;
- docker;
- docker-compose (на самом деле, можно без него, но с ним удобнее);
- git
- Основной образ - Ubuntu 18.04 (ubuntu:bionic) с добавленной архитектурой i386 (dpkg --add-architecture i386);
- s6 overlay для нормального автостарта samp03svr вместе с запуском контейнера;
- libstdc++6 для корректного запуска бинарника samp03svr.
- склонировать содержимое репозитория на Github;
- если необходимо - поправить Dockerfile (об этом - ниже в примечаниях);
- положить в etc/ фильтрскрипты/плагины/гейммоды/server.cfg с сохранением иерархии (ГМы - в etc/gamemodes, ФС - в etc/filterscripts и т.д).;
- запустить в папке с проектом docker-compose build;
- поднять контейнер через docker-compose up -d.
- Качать архив с sa-mp.com необязательно. При сборке контейнера утягивается соответствующий тарболл. Если нужно поменять версию сервера - в Dockerfile поправьте 35 (URL, откуда будет загружаться архив) и 38 (имя скачанного архива) строки;
- В etc/ можно положить хоть весь дистрибутив сервера целиком, вместе с бинарниками, и теоретически это даже должно работать (chmod +x идет уже после копирования в контейнер содержимого etc/). Но за работоспособность такого решения я не отвечаю;
- В контейнере нет ничего лишнего, поэтому использование собранных динамически (dynamic linked) so-шек может быть невозможно. Используйте статически собранные или правьте Dockerfile, чтобы при сборке контейнера ставились недостающие пакеты;
- Чтобы чистый сервер запускался, в Dockerfile на лету sed-ом заменяется rcon_password (если там стоит changeme, процесс попросту завершается). Если в etc/ лежит нужный server.cfg - из Dockerfile перед сборкой можно удалить строки 7, 8, 46 и 47;
- Чтобы подебажить что-то на лету - влетайте в контейнер через docker exec -it %ИмяКонтейнера% /bin/bash, но учтите, что изменения потеряются после остановки контейнера;
- server_log.txt внутри контейнера проброшен в /dev/stdout, если при падении процесса samp03svr упадет и контейнер - логи можно получить из docker logs. Если в etc/ будет лежать файл server_log.txt - при сборке образа он будет удален;
- при любом изменении содержимого папки etc/ придется пересобирать контейнер через docker-compose build --no-cache.