В данной статье рассматривается развертывание сервера OSRM с помощью Docker. Рассматривать варианты установки непосредственно на виртуальную машину или физический сервер я не буду, т.к не вижу в этом смысла.
Для развертывания сервиса не требуется ничего специфичного: устанавливаем wget, обновляем пакеты, устанавливаем нужное ядро (если требуется) и устанавливаем докер. На этом подготовка сервера завершена.
Для загрузки Docker-образа используем команду:
docker pull osrm/osrm-backend>
Карты берем тут.
wget -P /opt/osrm/data http://download.geofabrik.de/russia-latest.osm.pbf
После окончания процесса загрузки необходимо распаковать файл средствами OSRM и проиндексировать его. Это можно сделать 2мя способами. Тем, который указан в официальной документации и альтернативным. Я опишу оба (второй - мой авторский).
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-extract -p /opt/car.lua /data/russia-latest.osm.pbf
Стоит обратить внимание, что -v $(pwd):/data делает доступным текущий каталог в контейнере докер, если вы находитесь в директории, где нет файла .pbf, или по каким-то иным причинам хотите указать другой каталог - замените $(pwd) на нужный вам каталог.
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-partition /data/russia-latest.osrm
docker run -t -v $(pwd):/data osrm/osrm-backend:latest osrm-customize /data/russia-latest.osrm
docker run -t -i -p 5000:5000 -v $(pwd):/data -d osrm/osrm-backend osrm-routed — algorithm mld /data/russia-latest.osrm
После всех проделанных манипуляций мы получим Docker-container, с работающим backend сервером OSRM.
Способ описанный разработчиком конечно же работает, но он имеет один значительный минус, который мне не понравился, а так же у меня были вопросы и не все получалось сразу, поэтому я пошел своим путем. Для этого я зашел на github проекта и посмотрел что там в docker-file, который собирает образ. Это позволило мне разобраться что и где лежит внутри контейнера.
Так я узнал, что файлы графа хранятся в /data, а сами утилиты для работы с картой и построения графов в /usr/local/bin/. Отсюда можно сделать простой и логичный вывод - вовсе не обязательно плодить кучу мертвых контейнеров, которые потом лучше всего вычистить, можно все сделать в одном контейнере и потом просто удалить его.
Для реализации моего способа мы делаем следующее:
docker run -it -v "${PWD}:/data" osrm/osrm-backend bash
cd /usr/local/bin/
osrm-extract -p /opt/car.lua /data/russia-latest.osm.pbf
И ждем окончания процесса.
osrm-partition /data/russia-latest.osrm
Снова ждем окончания.
osrm-customize /data/russia-latest.osrm
Дожидаемся окончания.
exit
docker rm <container-name or container-id>
docker run -t -i -p 5000:5000 -v $(pwd):/data -d osrm/osrm-backend osrm-routed — algorithm mld /data/russia-latest.osrm
На этом настройка завершена.