Valhalla는 OSM(Open Street Map) 데이터를 활용하는 오픈소스 라우팅 엔진.
Valhalla API를 연동할 때는 일반적으로 Docker를 이용해서 서버를 띄우는 방식을 사용함
📜발할라 공식 문서 https://github.com/valhalla/valhalla
GitHub - valhalla/valhalla: Open Source Routing Engine for OpenStreetMap
Open Source Routing Engine for OpenStreetMap. Contribute to valhalla/valhalla development by creating an account on GitHub.
github.com
25.09.12 기준,
깃허브를 보면, 최근 버전은 Valhalla 3.5.1 이라고 되어 있지만
최근 버전이 아닌, 에러 수정된 버전인 릴리즈 3.6.0을 사용해야 함 (브랜치에 위치)


0. 현재 설치 상태
현재 python을 설치하고,
OSM 라이브러리인 libosmiun을 사용하기 위하여 (c++ 라이브러리 및 rust 라이브러리)
PyOsmium라는 python wrapper를 사용하기 위해 `pip install osmium` 명령어로 설치해 둔 상태.
1. cmd 환경 준비
# 우분투 환경에서 작업
wsl
# 작업 디렉토리로 이동
cd /mnt/c/Users/Gonae/Desktop/py-osmatic
2. OSM 데이터 준비
# custom_files 디렉토리 생성
mkdir custom_files
# 한국 전체 OSM 데이터 다운로드 (약 245MB)
wget -O custom_files/south-korea-latest.osm.pbf https://download.geofabrik.de/asia/south-korea-latest.osm.pbf
- OSM 데이터가 있어야 Valhalla API가 실행 됨!
3. Valhalla 소스코드
# Valhalla 소스코드 클론
git clone https://github.com/valhalla/valhalla.git
cd valhalla
# release-3.6.0 브랜치로 전환
git checkout release-3.6.0
- release-3.6.0 브랜치를 사용하여 도커 이미지를 다운 받아야 함
docker-compose.yaml 파일을 사용하지 않고,
따로 도커 이미지를 빌드하고, 빌드 된 도커 이미지를 run 명령어로 직접 컨테이너에 올려야 함
허브에서 풀 하면, cost 같은 조건 계산할 때 데이터가 안 맞기 때문에~..
4. Docker 이미지 빌드
# Docker 이미지 빌드 (기본 Dockerfile 사용)
docker build -f docker/Dockerfile -t valhalla:release-3.6.0 .
# script 도커 이미지 빌드 (베이스 이미지를 기반으로)
docker build -f docker/Dockerfile-scripted -t docker-scripted.test --build-arg VALHALLA_BUILDER_IMAGE=valhalla:release-3.6.0 .
- 기본 Dockerfile을 사용해서 베이스 이미지를 빌드하고
- 도커 script 이미지를 추가로 빌드하는 방식 >> 5번에서 script 이미지로 컨테이너 실행.
- docker build -f docker/Dockerfile -t valhalla:release-3.6.0 . 로 베이스 이미지 빌드한 이후에
docker build -f docker/Dockerfile-scripted -t docker-scripted.test --builld-arg VALHALLA_BUILDER_IMAGE=valhalla:release-3.6.0 . 로 script 이미지 빌드하는 단계가 추가돼야함
- docker build -f docker/Dockerfile -t valhalla:release-3.6.0 . 로 베이스 이미지 빌드한 이후에
- 컨테이너 실행 단계에서 script 이미지로 실행할거지만, 도커 베이스 이미지를 베이스로 할 것이기 때문에 둘다 필요.
5. Valhalla 컨테이너 실행
# Valhalla 컨테이너 실행
docker run -dt --name valhalla-3.6.0 -p 8002:8002 \
-v /mnt/c/Users/jkkan/Desktop/py-osmatic/custom_files:/custom_files \
docker-scripted.test
- 앞에서도 말했지만, docker-compose up 하지 말고, 이미지 build 따로, docker run 따로 실행할 것.
- 4번 단계에서 script 이미지로 빌드했기 때문에, 해당 script image로 컨테이너 실행(docker run)할 것
6. Valhalla 서버 연동 및 타일 확인
- 이미지 2개와 컨테이너 하나~~~



- 타일도 생성되고, 설정파일(valhalla.json)도 생성된 것 확인할 수 있음

7. 그밖의 에러 코드
1. 도커 이미지 빌드시, cd valhalla가 아닌 cd docker로 진행하여 에러 발생
- 발생 원인
: Docker 빌드 컨텐스트는 현재 디렉토리가 기준이 되고, Dockerfile의 COPY 명령어는 빌드 컨텍스트 기준으로 파일을 찾음
build에 필요한 COPYING 폴더는 valhalla/docker/가 아닌, 상위 디렉토리인 valhalla/에 위치하고 있기 때문에
COPYING 폴더를 못 찾는다는 에러 발생 - 해결책
: valhalla 루트 디렉토리에서 빌드해야함
2. Valhalla 기본 도커 이미지 빌드시, exit code 2 오류 발생
(fatal error: ankerl/unordered_dense.h: No such file or directory)

- 발생 원인
: 라이브러리 누락으로 인한 컴파일 실패 - 해결책
: git submodule update --init --recursive으로 Submodule 초기화

'👩🏻💻TIL (Today I Learn) > Docker' 카테고리의 다른 글
| 🐈⬛ github actions를 통한 cicd 파이프라인 구축 (1) | 2025.06.02 |
|---|---|
| 🐋 aws를 활용하여 Docker로 배포하기 (2) | 2025.05.30 |
| 🐋 로컬에서 Docker로 배포하기 (1) | 2025.05.26 |
| 🐋Docker를 통해 배포할 때 환경변수 설정하는 방법 (0) | 2025.05.21 |