공식 GDAL 이미지로 GIS & Python 개발환경 구축하기 (feat. Docker)

식빵·2025년 4월 14일
0

GIS

목록 보기
10/14
post-thumbnail

✨ GDAL Image 사용 이유

Python 기반 GIS 개발 환경에서 GDAL 은 필수적입니다.
다만 GDAL 설치 과정이 까다로울 수 있는데,
이를 간편하게 해결하려면 GDAL이 포함된 container image를 활용하는 것이 좋습니다.

이제, 그 방법을 살펴보겠습니다. 🚀


😅 급하신 분들을 위해

급하신 분들은 🐳 Dockerfile 로 한방에 세팅하기 목차의 내용으로 Docker image 생성 후,
곧바로 🖥️ VS Code - Dev Container 목차를 따라하시면 됩니다.
그러면 개발환경 세팅은 끝입니다.

만약 이 Dockerfile 의 내용이 궁금하다면 목차를 이어서 보시면 됩니다.



🎯 이 글의 목표

  1. DockerGdal Container 를 실행

  2. Containerpython 개발에 필요한 기본적인 패키지 추가 설치

  3. Visual Studio CodeDev Container 플러그인으로
    Container 에 접속하고 개발할 수 있는 환경을 세팅



🐳 Docker - GDAL Container

Docker 를 통해서 GDAL 공식 이미지로 컨테이너를 띄우고 사용하는 방법은
제가 이전에 작성한 글을 참고하시면 되겠습니다.




🐍 GDAL 컨테이너에 pip 설치

pip 설치는 필수가 아닙니다.
하지만 일반적으로 python 을 사용하면서 pip 없이 개발하는 건
제가 보기에는 거의 불가능합니다.

그리고 이미 컨테이너에 설치된 GDAL 패키지만 있다고 모든 GIS 관련 처리를
하는 것은 효율적이지 않다고 생각됩니다.

오히려 pip 를 통해서 Fiona, Shapely, Rasterio 등과 같은 패키지들를
설치하고 GDAL 과 조화롭게 사용하는 게 효율적이라 생각됩니다.

서론이 길었네요. 이제 pip 를 설치해보죠.

apt update && apt install -y python3-pip
pip list -v # 이걸로 정확한 설치 위치와, 현재 설치된 것들을 모두 알 수 있다.

pip 로 뭔가 설치한 적이 없지만, gdal container 내부에 이미
설치된 패키지들이 보이네요.




✨ 가상환경(venv) 설정

참고로 이 상태에서 pip 명령어를 사용하면 아래와 같은 에러가 남니다.

pip 를 이대로 사용하면 System Wide(=Global) 환경에 설치된 패키지에 영향을 줄 수 있다!
라는 경고와 함께 에러가 발생하는 것을 확인할 수 있습니다.

친절하게도 이 경고문에는 venvpipx 를 사용해서 가상환경을 먼저 만들고,
그 안에서 pip 명령어를 쓰면 된다고 알려줍니다.

저는 둘 중에서 venv 를 통한 방법을 사용하겠습니다.

# venv 사용을 위한 패키지 설치
apt install python3.12-venv

# 가상환경 기본 세팅
mkdir /app_workspace && cd /app_workspace
python3 -m venv .venv
ls -alF 					   # .venv 디렉토리가 생겼는지 확인

# venv 가상환경 활성화
chmod u+x .venv/bin/activate # file permission 변경
source .venv/bin/activate      # 가상환경 활성화 스크립트 적용
						       # 참고: 가상환경 종료는 deactivate 

# 가상 환경 정상 세팅 확인 (경로 확인)
which pip
which python

# 간단한 테스트
pip install --upgrade pip

pip 패키지가 24.0 -> 25.0.1 로 버전업이 된것을 확인할 수 있습니다!
이렇게 함으로써 앞으로 System-wide(=global) 환경과 분리된 가상환경(venv)에서
안심하고 pip 로 필요한 패키지를 설치하고 사용할 수 있게 되었습니다 ✨.




✨ Global package 사용하기

그런데 venv 가상환경에서 pip list 라고 입력해서
설치된 항목을 패키지들을 보면 가상환경 외부에 설치된
Global 패키지들이 안 보입니다. (아무래도 독립된 환경이니 당연하겠죠?)

Global 환경의 설치된 패키지들은 deactivate 를 입력해서
venv 가상환경을 비활성화하고 pip list -v 명령어를 치면 보입니다.

Global 패키지들을 venv 가상환경 활성화 상태에도 사용하고 싶다면
.venv/pyvenv.cfg 파일에서 include-system-site-packages 설정값을
true 로 변경해주면 끝입니다.

deactivate # 일단 가상환경에서 빠져나오고
vim .venv/pyvenv.cfg # 수정! 
### 혹시라도 vim 없다면 설치해주세요! apt install -y vim 

# 다시 가상환경 활성화
source .venv/bin/activate

## 설치 목록 확인 (venv 환경에만 깔린 local 라이브러리 목록)
pip list -l

## 설치 목록 확인 (venv 환경에 깔린 global + local 라이브러리 목록)
## 이게 venv 환경에서 실제 사용할 수 있는 패키지 목록들입니다.
pip list 

마지막으로 venv 환경에서 정상적으로 gdal 이 import 되는지 확인해봅시다.

python # 먼저 python 인터프리터 실행!

### 인터프리터 내부에서 아래처럼 입력해서 에러가 안 났으면
### global 에 설치된 GDAL 패키지를 사용할 수 있는 상태라는 의미입니다.
from osgeo import gdal
from osgeo import ogr

exit() # 다 봤으면 python 인터프리터 종료 





🖥️ VS Code - Dev Container

이제 visual studio code (이하 vs code) 를 통해서 이 gdal 컨테이너 내부로 들어갈 겁니다.
vs code 가 설치되지 않은 분들은 먼저 설치를 해주세요.
이후에 vs code 실행 후, Dev Containers 플러그인을 설치해줍니다.


이후 ctrl + shift + p 를 입력하면 vs code 상단에 검색란이 생기는데,
Dev Containers: Attach to Running Container... 를 검색하고 Enter!


이후 container 목록을 보여주는데,
아까부터 python 환경 구성 작업을 하던 gdal container 하나만
실행해서 아래 그림처럼 하나의 목록만 보입니다. 선택해줍니다.


이후 vs code 가 새로운 창이 뜨고 조금 시간이 지난 후에
좌측 메뉴에서 Open Folder 버튼을 클릭하고 앞서
venv 환경을 구축한 디렉토리를 선택해줍니다.

이후에 또 다시 visual studio code 가 다시 새로운 창이 뜹니다.
해당 창이 뜨면 python 플러그인을 설치해줍니다.

이제 간단하게 python 이 정상 동작하는지 테스트해보겠습니다.
저는 Hello World 를 출력하는 코드를 작성하고 실행시켜봤습니다.

여기서 중요한 건 venv 활성화 환경에서 실행되는 것입니다.
실행된 콘솔창의 왼쪽 끝에 (.venv) 라는 문구가 잘 보이므로,
원하던 대로 venv 환경에서 실행된 겁니다!

혹시라도 venv 환경에서 실행이 안됐다면 python 인터프리터가 잘 설정되어 있는지 확인해 줍니다. ctrl + shift + p 를 누르면 상단에 검색란이 생깁니다.
검색란에 Python: Select Interpreter 를 검색합니다.

이후 아래처럼 나오면 ./.venv/bin/python 경로에 있는 인터프리터를 선택해줍니다.



개인적으로 여기까지만 해도 충분하지만, Jupyter Notebook 를 자주 사용하시면
Jupyter Plugin 도 설치하시는 걸 추천드립니다.

설치 후에 ctrl + shift + p 입력하고,
검색란에 Create: New Jupyter Notebook 을 검색합니다.


그러면 새로운 Notebook 이 생성되면서 화면에 보이게 되는데,
우측 상단의 Select Kernel 클릭 > Python Environment 클릭 > .venv 선택 합니다.


이후에 pip 로 jupyterlab 를 설치하면 끝입니다.

pip install jupyterlab




여기까지가 일단 기본 세팅법입니다.
다음 글에서는 이 환경에서 유용한 다른 gis 관련 python 라이브러리를 설치해보고
활용해보는 방법을 알아보겠습니다.

혹시라도 PostGIS 와 관련된 개발환경도 구축하고 싶다면
다음글도 이어서 보시면 됩니다 😀




🚀 더 쉽고 빠르게 세팅하는 법

🐳 Dockerfile 로 한방에 세팅

Dockerfile 을 아래처럼 작성합니다.

참고: 베이스 이미지로 쓰인 gdal 이미지 tag 목록 링크

# FROM ghcr.io/osgeo/gdal:ubuntu-small-latest
FROM ghcr.io/osgeo/gdal:ubuntu-small-3.11.0

# 한글도 읽기/쓰기가 가능토록 함
ENV LANG=C.UTF-8

# Timezone 을 우리나라에 맞춤
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# 파이썬 내용 업데이트
RUN apt update && apt install -y python3-pip python3.12-venv

# python workspace 경로 지정
ENV PYTHON_APP_HOME=/app_workspace

# python workspace 디렉토리에 venv 환경 조성
RUN mkdir $PYTHON_APP_HOME && python3 -m venv $PYTHON_APP_HOME/.venv

# Global 라이브러리를 venv 환경에서도 공유해서 사용
RUN sed -i \
	's/include-system-site-packages = false/include-system-site-packages = true/' \
    $PYTHON_APP_HOME/.venv/pyvenv.cfg

# venv 환경 활성화 스크립트 File Permission 변경
RUN chmod u+x $PYTHON_APP_HOME/.venv/bin/activate

# (venv 환경) pip 로 파이썬 라이브러리 설치
RUN /bin/bash -c "source ${PYTHON_APP_HOME}/.venv/bin/activate \
&& pip install --upgrade pip \
&& pip install jupyterlab \
&& deactivate"

# (선택사항) 추가적으로 필요한 라이브러리 설치
# RUN apt install -y vim

# (선택사항) alias 지정, devcontainer 실행 시 개발 편의성을 위함.
RUN echo 'alias activate_venv="source ${PYTHON_APP_HOME}/.venv/bin/activate"' 	\
	>> /etc/bash.bashrc
RUN echo 'alias goto_py_home="cd ${PYTHON_APP_HOME}"' \
	>> /etc/bash.bashrc

# container 기본 Working directory 지정
WORKDIR ${PYTHON_APP_HOME}

# 아래 ENTRYPOINT, CMD 는 docker stop 명령어 사용시 정상적인 종료를 위함.
ENTRYPOINT ["/bin/sh"]
CMD ["-c", "echo Container started\ntrap \"exit 0\" 15\n\nexec \"$@\"\nwhile sleep 1 \u0026 wait $!; do :; done", "-"]

이후 build 및 run 해서 container 내부 상태 확인

# docker build 및 run
docker build --tag  gdal-python .
docker run --name gdal-python -d gdal-python

# container 내부 접속 상태
docker exec -it gdal-python bash

이후에 🖥️ VS Code - Dev Container 를 그대로 따라하시면 개발환경 세팅 끝입니다.




🗺️ 참고한 링크



PS. Anaconda 를 쓰지 않는 이유

이 글을 보고 Anaconda 쓰면 되지 않냐고 생각할 수도 있지만
Anaconda 는 어느정도 인원이 되는 회사에서 사용할 경우 돈을 내야합니다.
저는 회사에서 사용해야되서 Anaconda 는 선택사항이 아니였습니다.

추가적으로 회사에는 Window, Mac 둘 중 하나를 사용하는 경우가 많은데,
동일하게 동작하는 개발 환경을 구축하기 위해서는 이 방법이 가장 좋다고 판단했습니다.

profile
백엔드 개발자로 일하고 있는 식빵(🍞)입니다.

0개의 댓글