👨‍💻

ファイルコピーでpostgreSQLのデータぶっこ抜いてローカルのDockerで動かす

2024/01/25に公開

おはこんばんにちわ、狸です

今日も今日とて、しょうもない仕事でやってることの備忘録です。

ポスグレで動いてるようわからんシステムの機能追加案件させられることになりローカルで動作確認環境を立てるために検証環境のDBをローカルのDockerで動くようにしたのでメモっときます。

検証環境のデータぶっこ抜く

普通はpg_dumpしてローカルでinitdbしたやつにpg_restoreを〜

みたいな事するんでしょうが…

そんなお行儀のいい面倒な事やってたらこんな記事書く必要なんて無いんですよ

というわけで検証環境のDBファイルをマルっとローカルに圧縮コピーします。

$ ssh root@検証環境IP tar czvf - /var/lib/postgresql/data | tar xzvf - --strip-components=3
$ ls
data

終了。

データの権限をDockerのポスグレに合わせる

コピー元のポスグレのバージョンが9.2.15だったので
今回使うDockerイメージはpostgres:9.2.15として以下のようにpostgresユーザのUID/GIDを確認

$ docker run -it --rm postgres:9.2.15 id postgres
uid=999(postgres) gid=999(postgres) groups=999(postgres),109(ssl-cert)

DBファイルを同じGID/UIDに変更

$ find data | sudo xargs chown 999:999

はいOK

Dockerで起動する

dataディレクトリをDockerのポスグレが利用するdata領域と同じ場所にマウントして起動する

$ docker run -it --rm \
-v $(pwd)/data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:9.2.15

はい、これで無事起動しました。

めでたし、めでたし。。。

といきたいところでしたが以下のようなエラーが出ました。

[2024-01-25 14:08:32 JST]   [1-1] LOG:  invalid value for parameter "lc_messages": "ja_JP.SJIS"
[2024-01-25 14:08:32 JST]   [1-2] LOG:  invalid value for parameter "lc_monetary": "ja_JP.SJIS"
[2024-01-25 14:08:32 JST]   [1-3] LOG:  invalid value for parameter "lc_numeric": "ja_JP.SJIS"
[2024-01-25 14:08:32 JST]   [1-4] LOG:  invalid value for parameter "lc_time": "ja_JP.SJIS"
[2024-01-25 14:08:32 JST]   [1-5] FATAL:  configuration file "/var/lib/postgresql/data/postgresql.conf" contains errors

ロケールSJISかよ…

というわけでSJIS対応のためだけにDockerfile作って…

Dockerfile
FROM postgres:9.2.15

# SJISロケール追加
RUN echo ja_JP.SJIS SHIFT_JIS >> /etc/locale.gen && locale-gen

# ログ保存ディレクトリ作成
RUN mkdir -p /var/lib/postgresql/log && chown postgres:postgres /var/lib/postgresql/log

# LANG設定変更
ENV LANG=ja_JP.SJIS

ビルド

$ docker build -t testdb .

気を取り直して作ったイメージから起動

$ docker run -it --rm \
--name testdb \
-v $(pwd)/data:/var/lib/postgresql/data \
-p 5432:5432 \
testdb

一旦他のコンソールから動作確認

$ docker exec -it -e LANG=C testdb psql dbname username
psql (9.2.15)
Type "help" for help.

dlsdb=> 

はいOK

docker-compse化

あとはcomposeファイル作って

docker-compse.yml
version: '3'

services:
  testdb:
    build:
      context: ./docker
    volumes:
      - ./data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

起動

$ docker-compose up -d

localhostの5432にpsqlしてつながればOK

$ psql -h localhost dbname username

あとは煮るなり焼くなり好き放題したらええです。

一応ここまでで出来たディレクトリ構成を載せとくとこんな感じ

$ tree
.
├── data
├── docker
│   └── Dockerfile
└── docker-compose.yml

それでは今日はこの辺で。

とっぴんぱらりのぷう

P.S.

備忘録として始めたので書くことある程度書いたら更新頻度がどんどん下がりますね。
しかしロケール周り毎回だるいなぁ…

Discussion