[PostGIS] Powershell 로 postgis/postgis image 기반의 container 설정 및 생성하는 법

식빵·2023년 6월 17일
0

postgis

목록 보기
1/9
post-thumbnail

참고(1): Window 10 환경에서 powershell 로 명령어를 입력해서 세팅하는 방법입니다.
참고(2): powershell 은 될 수 있으면 관리자 권한으로 실행시켜주시기 바랍니다!


최초 image, container 생성

docker pull postgis/postgis && cd ~ && `
mkdir $env:USERPROFILE\Desktop\postgis_install -ErrorAction SilentlyContinue; `
cd $env:USERPROFILE\Desktop\postgis_install && `
"FROM postgis/postgis
RUN localedef -i ko_KR -c -f UTF-8 -A /usr/share/locale/locale.alias ko_KR.UTF-8
ENV LANG ko_KR.utf8
ENV TZ Asia/Seoul
COPY ./extension_change.sql /docker-entrypoint-initdb.d" > Dockerfile && `
"DROP EXTENSION IF EXISTS postgis_tiger_geocoder;
DROP EXTENSION IF EXISTS fuzzystrmatch;
DROP schema if exists tiger, tiger_data;
CREATE EXTENSION IF NOT EXISTS postgis_raster;
ALTER DATABASE postgres SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';" > extension_change.sql && `
docker build --tag my-korea-postgis . && `
docker run --name MyKorPostGIS -d -p 10011:5432 -e POSTGRES_PASSWORD=postgres my-korea-postgis && `
cd .. && rm -Recurse -Force .\postgis_install

위 명령어가 하는 작업은 아래와 같습니다.

  • Desktop 경로(= 컴퓨터 켰을 때의 보이는 화면의 경로)에 임시 폴더 생성(postgis_install)
  • 해당 폴더 경로로 이동
  • postgis/postgis docker image pull
  • Dockerfile 을 활용할 공간을 생성(= 폴더 생성)
  • 폴더 내로 경로 이동
  • Dockerfile 생성 및 작성, 내용은 대략 아래와 같음
    • Locale 이 ko_KR 로 되도록 설정
    • TZ(= Time Zone) 을 한국의 시간대로 맞춰줍니다.
    • postgis container 에 extension_change.sql 파일을 copy 함.
      • 이 파일은 postgis 컨테이너에서 쓸데없는 extenison 을 삭제하거나,
      • 필요한 extension 을 추가하는 쿼리를 작성되어 있다.
  • extension_change.sql 파일 생성 및 내용 작성
  • docker build 를 통해서 Dockerfile 기반의 이미지 생성
  • docker run 을 통해서 container 생성
  • 마지막으로 더 이상 필요없는 Dockerfile 이 들어있는 폴더(postgis_install)를 삭제

위 과정을 통해서 아래와 같은 결과물들이 생성됩니다.

  • docker image: my-korea-postgis
  • docker container: MyKorPostGIS (using port "10011")

참고: 위 명령어 중에서 sql 관련된 부분 추가 설명

  • 먼저 쓸데 없는 postgis_tiger_geocoder 관련 Extension 및 Schema 를 삭제합니다.
    이건 US(= 미국) 기반의 지오코딩을 지원하는 것이기 때문에 우리나라와 관련된 지오코딩은 지원하지 않습니다. 아무리 생각해도 쓸일 없을 거 같아서 지웠습니다.
  • 그리고 postgis_tiger_geocoder 를 위해 설치된 fuzzystrmatch 도 지웁니다.
  • 저의 경우에는 raster 데이터를 다룰 수 있는 postgis_raster Extension 을 설치했습니다. 필요없다면 위 명령어 중 일부를 아래처럼 변경하면 됩니다.

BEFORE

"DROP EXTENSION IF EXISTS postgis_tiger_geocoder;
DROP EXTENSION IF EXISTS fuzzystrmatch;
DROP schema if exists tiger, tiger_data;
CREATE EXTENSION IF NOT EXISTS postgis_raster;
ALTER DATABASE postgres SET postgis.gdal_enabled_drivers TO 'ENABLE_ALL';" > extension_change.sql

AFTER

"DROP EXTENSION IF EXISTS postgis_tiger_geocoder;
DROP EXTENSION IF EXISTS fuzzystrmatch;
DROP schema if exists tiger, tiger_data;" > extension_change.sql

이렇게 변경해서 실행을 완료 시킨 후에 docker exec -it MyKorPostGIS psql -U postgres -c '\dx' 명령어로 extension 목록을 가볍게 확인해보시기 바랍니다.




container 재생성

위 처럼 한번하고 나서는 Dockerfile 로 build 한 이미지가 생성된 상태이니
docker run 을 바로 사용해서 container 를 재생성하면 끝입니다.

docker run --name <Docker Container 명> -d -p <host포트번호>:5432 -e POSTGRES_PASSWORD=postgres my-korea-postgis

여기까지만 읽으시면 본문은 사실상 끝입니다.
이 아래 목차들은 모두 학습을 위한 보충 내용이므로 필수가 아닙니다.




보충

1. postgis/postgis Dockerfile

참고: https://github.com/postgis/docker-postgis/blob/master/15-3.3/Dockerfile

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "make update"! PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM postgres:15-bullseye

LABEL maintainer="PostGIS Project - https://postgis.net" \
      org.opencontainers.image.description="PostGIS 3.3.3+dfsg-1.pgdg110+1 spatial database extension with PostgreSQL 15 bullseye" \
      org.opencontainers.image.source="https://github.com/postgis/docker-postgis"

ENV POSTGIS_MAJOR 3
ENV POSTGIS_VERSION 3.3.3+dfsg-1.pgdg110+1

RUN apt-get update \
      && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
      && apt-get install -y --no-install-recommends \
           # ca-certificates: for accessing remote raster files;
           #   fix: https://github.com/postgis/docker-postgis/issues/307
           ca-certificates \
           \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts \
      && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/10_postgis.sh
COPY ./update-postgis.sh /usr/local/bin

참고로 initdb-postgis.sh 파일의 내용은 아래와 같다.
자세히 보면 어떤 Extenison 을 까는지 알 수 있다.

#!/bin/bash

set -e

# Perform all actions as $POSTGRES_USER
export PGUSER="$POSTGRES_USER"

# Create the 'template_postgis' template db
"${psql[@]}" <<- 'EOSQL'
CREATE DATABASE template_postgis IS_TEMPLATE true;
EOSQL

# Load PostGIS into both template_database and $POSTGRES_DB
for DB in template_postgis "$POSTGRES_DB"; do
	echo "Loading PostGIS extensions into $DB"
	"${psql[@]}" --dbname="$DB" <<-'EOSQL'
		CREATE EXTENSION IF NOT EXISTS postgis;
		CREATE EXTENSION IF NOT EXISTS postgis_topology;
		-- Reconnect to update pg_setting.resetval
		-- See https://github.com/postgis/docker-postgis/issues/288
		\c
		CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
		CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder;
EOSQL
done



2. template_postgis

psql 로 \l 명령어를 치면 데이터베이스 목록을 확인할 수 있습니다.

postgres-# \l
                                                  데이터베이스 목록
       이름       |  소유주    | 인코딩 |  Collate   |   Ctype     | ICU 로케일 | 로케일 제공자 |      액세스 권한
------------------+----------+--------+------------+------------+------------+---------------+-----------------------
 postgres         | postgres | UTF8   | ko_KR.utf8 | ko_KR.utf8 |            | libc          |
 template0        | postgres | UTF8   | ko_KR.utf8 | ko_KR.utf8 |            | libc          | =c/postgres          +
                  |          |        |            |            |            |               | postgres=CTc/postgres
 template1        | postgres | UTF8   | ko_KR.utf8 | ko_KR.utf8 |            | libc          | =c/postgres          +
                  |          |        |            |            |            |               | postgres=CTc/postgres
 template_postgis | postgres | UTF8   | ko_KR.utf8 | ko_KR.utf8 |            | libc          |
(4개 행)

그런데 여기서 template_postgis 라는 게 있습니다.
postgresql 을 처음 설치할 때는 기본적으로 postgres, template0, template1 이 존재하는 건 알고 있었지만 template_postgis 라는 건 이번에 처음 봤습니다.

검색을 해보니 database 생성 시에 postgis 기본 기능들을 미리 세팅한 템플릿이라고 합니다.

참고 링크: https://docs.bitnami.com/aws/infrastructure/postgresql/configuration/create-postgis-template/

createdb template_postgis

# Allows non-superusers the ability to create from this template
psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';"
psql template_postgis -c "create extension postgis"
psql template_postgis -c "create extension postgis_topology"
psql template_postgis -f <installdir>/postgresql/share/contrib/postgis-2.0/legacy.sql

# Enable users to alter spatial tables.
psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;"
psql -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;"
psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"

psql 에 접속해서 해당 템플릿으로 데이터 베이스를 생성하고 곧바로
postgis 버전을 체크하면 정상 출력되는 것을 확인할 수 있습니다.

CREATE DATABASE <생성할 DB 명> TEMPLATE template_postgis;
SELECT POSTGIS_FULL_VERSION();
profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글