読者です 読者をやめる 読者になる 読者になる

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

PostgreSQLのDockerfileを作った

Docker postgresql

PostgreSQL 9.4.1のDockerfileを作った。

https://github.com/opamp/postgres

普通ならDockerfileでVOLUMEとかPORTとか指定するところだが、これはdocker-composeで割り当てるの前提で一切書いてない。

PORTについて

ポートはPostgresデフォルトの5432ポートを使うので、5432を外部のポートのどこかに結びつければ良い感じ。

  ports:
    - "5432:5432"

VOLUMEについて

うちのDockerベースのサーバー群は昔からログをDockerに拾わせないで、ホストの/var/log/docker以下当たりに分けて入れるようにしていたので、このDockerfileもログをファイルに出力するようにしてみた。

なので、VOLUMEに指定すべきディレクトリはログを入れておくディレクトリと、PGDATAになるディレクトリ。なのでうちでは次のようにしている。

  volumes:
    - /var/log/docker/postgresql:/var/log/pg_log
    - /var/lib/postgresql:/var/lib/postgresql

ENVIRONMENTについて

公式postgresイメージはユーザーも指定できるが、私の技術力がないばっかりに初回起動時にユーザーが存在しなければ作成して云々というのを書きたくなかった書けなかったので、ユーザーはデフォルトの"postgres"ユーザーを使う。
したがって、指定できるのはパスワードのみ。

  environment:
    - POSTGRES_PASSWORD=hogepiyo

ちなみにデフォルト値は"postgres"になっている。
パスワードはinitdbが走った場合のみ設定されるようになっているので、すでにinitdb済みのPGDATAがVOLUMEでマウントされている場合には全く意味がない。
つまりはじめての起動時のみ設定されるので、それ以降変えても全く効果がない。

終わりに

公式のpostgresを使っていたらコンテナを作成するたびにVOLUMEのディレクトリがinitdb済みであってもinitdbし直す仕様のようで、データを全部消し飛ばされてしまったので自作した次第。
(まあデータは定期バックアップがあるしそもそもそんなに大規模には使ってないので傷は浅いんですが)

Dockerhubには多分あげないので、もし私の作ったへっぽこイメージを使いたいという奇特な方はgithubから落として、docker-composeでbuildしてください(もちろん何かあっても責任は取れませんが)。
最後に私が実際にこのイメージを使う時のdocker-compose.ymlの記載を載せます。もちろんパスワードとかは変えてます。

それと、postgresの設定を変えたければイメージをビルドする前にpgconfigの中にある設定ファイルを書き換えるか、ビルド後に生成されたPGDATA内のファイルを直接編集するといいと思います。

postgres:
  build: postgres/
  ports:
    - "5432:5432"
  volumes:
    - /var/log/docker/postgresql:/var/log/pg_log
    - /var/lib/postgresql:/var/lib/postgresql
  environment:
    - POSTGRES_PASSWORD=yoruhasizukanisitekudasai
Firefox ブラウザ無料ダウンロード