ヒノマルクです。タイトルのような仕様で環境構築をする機会があったので、どなたかのお役に立てればと思い記事にしておきます。
※ 実業務だとdockerイメージを作成するためにプロキシの設定が必要だったりと少々複雑になるので、今回は簡略化しています。自宅で気軽にテストする分には問題ないと思います。
postgreSQLのdocker公式イメージ
今回環境構築するにあたり、postgreSQLのdocker公式イメージを使っています。
docker公式イメージにはPostGISは含まれていないので、別途インストールしてあげる必要があります。
PostGISが含まれている他のイメージも公開されているのですが、ヒノマルクは公式イメージを使いたかったのと、きちんとPostGISのインストール方法を理解しておきたかったので自分で導入しました。(提供イメージにないバージョンでも将来的に環境構築できるかも知れないというメリットがあります。)
※ もっと楽をしたい場合はこちらのイメージはpostgreSQLのdocker公式イメージを利用してPostGIS環境を構築してくれているようなので活用してみてください。
※ PostGISが必要ない場合は、単純に公式イメージをdocker runすればpostgreSQL環境が構築できるのでより簡単かも知れません。
Dockerfileの作成
Dockerfileはイメージを作成するためのコマンドを事前にテキストファイルに記載しておくことで、自動で新しいdockerイメージを構築してくれます。
FROM docker.io/postgres:12
ENV LANG ja_JP.UTF-8
ENV TZ Asia/Tokyo
RUN apt-get update && apt-get install locales dialog tzdata -y \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8 \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
RUN apt update \
&& apt-get install wget vim iputils-ping net-tools unzip less -y \
&& apt-get install postgresql-12-postgis-3 -y
RUN echo "create extension if not exists postgis;" > /docker-entrypoint-initdb.d/dbinit.sql
postgreSQLのdocker公式イメージのページに書いてありますが、ロケールやタイムゾーンを日本語にする設定やPostGISを追加でインストールするコマンドを追加しています。
さらに、docker-entrypoint-initdb.dフォルダの中にdbinit.sqlがありますが、こちらはdocker runでコンテナを作成したときにPostGISを有効化するコマンドを記載しています。
追加するエクステンションによってはpostgresql-server-dev-12も必要になる場合があるかもしれません。
その場合は下記コマンドも追加します。
&& apt-get install postgresql-server-dev-12 --no-install-recommends -y
docker build -t hinomaruc/postgres:12 .
Sending build context to Docker daemon 292.2MB Step 1/6 : FROM docker.io/postgres:12 ---> afee8d9d57fc ・・・省略・・・ Successfully built 2fed9f192556 Successfully tagged hinomaruc/postgres:12
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE hinomaruc/postgres 12 2fed9f192556 51 minutes ago 648MB postgres 12 afee8d9d57fc 9 days ago 371MB oracle/database 21.3.0-xe f21325365fcc 12 days ago 11.4GB cloudera/quickstart latest 4239cd2958c6 5 years ago 6.34GB
無事作成されていました。パッケージを追加したので倍ほどの容量になっています。
docker run -it -d \
-p 5432:5432 \
-e POSTGRES_PASSWORD=hinomaruc \
-e PGDATA=/var/lib/postgresql/data/ \
-v /Users/hinomaruc/postgres:/var/lib/postgresql/ \
--shm-size=64m \
--name postgres12 \
hinomaruc/postgres:12
PGDATAやshm-sizeはデフォルトの値を記載しています。お好みで変更してください。
docker psでコンテナのステータスを確認します。
「Up 〇〇 minutes」などになっていれば成功です。
エラーがあると存在しないか docker ps -a コマンドでみるとExitedとかになっています。
docker ps
"CONTAINER ID" IMAGE COMMAND CREATED STATUS PORTS NAMES d0d29eae86e0 hinomaruc/postgres:12 "docker-entrypoint.s…" 38 minutes ago Up 21 minutes 0.0.0.0:5432->5432/tcp postgres12
postgres12 + PostGIS3 のコンテナを作成することができました。
次にPostGISのクエリを実行して動作確認して見ます。
pgAdmin4 で作成したコンテナのpostgreSQL12に接続
pgAdmin4のインストール方法は下記にまとめてあります。
接続情報は下記を入力します。
General → Name: localhost (識別できれば名前は何でもよい)
Connection → Host: localhost (サーバーIPやホスト名など、今回はローカルホスト)
Connection → Port: 5432 (postgreSQLのデフォルトポート)
Connection → Username: postgres
Connection → Password: hinomaruc (POSTGRES_PASSWORDで指定した値)
クエリエディタに下記サンプルクエリを記入して実行してみてください。
CREATE TABLE gtest (id serial primary key, name varchar(20), geom geometry(LINESTRING));
INSERT INTO gtest (ID, NAME, GEOM)
VALUES (
1,
'First Geometry',
ST_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)')
);
SELECT id, name, geom AS geom FROM gtest;
実行結果は Geometry Viewerタブで見て、画像のように表示されていたら成功です。
pgAdmin4のGeometry Viewerタブの表示画面
MacでpostgreSQL環境を作成するのであれば、Postgres.appを使う方がdockerでやるより楽ですね。