참고(1):
Window 10
환경에서powershell
로 명령어를 입력해서 세팅하는 방법입니다.
참고(2):powershell
은 될 수 있으면 관리자 권한으로 실행시켜주시기 바랍니다!
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 위 과정을 통해서 아래와 같은 결과물들이 생성됩니다.
my-korea-postgis
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
목록을 가볍게 확인해보시기 바랍니다.
위 처럼 한번하고 나서는 Dockerfile 로 build 한 이미지가 생성된 상태이니
docker run 을 바로 사용해서 container 를 재생성하면 끝입니다.
docker run --name <Docker Container 명> -d -p <host포트번호>:5432 -e POSTGRES_PASSWORD=postgres my-korea-postgis
여기까지만 읽으시면 본문은 사실상 끝입니다.
이 아래 목차들은 모두 학습을 위한 보충 내용이므로 필수가 아닙니다.
참고: 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
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();