とにかく雑

とにかく雑に思い立ったことを書く。内容は私自身の見解であり、所属組織の立場・戦略・意見を代表するものではありません。

PgAdminにDB接続情報を環境設定的に構成する方法

あらかじめ接続情報を入れておきたいとか、構成管理したいとか、そういった状況。

設定方法はいくつかのサイトで解説が見られるが、バージョン依存で上手くいかないケースが散見される。
stackoverflow.com

最終的に上手くいったのは以下の方法となった。
stackoverflow.com

以下、Docker Compose を前提としたソースコード

docker-compose.yaml

version: "3.9"
services:
  postgres_db:
    image: postgres
    volumes:
      - ./postgres_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "15432:5432"
  pgadmin:
     image: dpage/pgadmin4:7.1
     restart: always
     environment:
       PGADMIN_DEFAULT_EMAIL: pgadmin@pgadmin.com
       PGADMIN_DEFAULT_PASSWORD: pgadmin
     ports:
       - "8080:80"
     volumes:
       - ./servers.json:/pgadmin4/servers.json
       - ./pgpass:/var/lib/pgadmin/pgpass
     depends_on:
       - "postgres_db"

ファイルマウントが重要なわけだが、pgpass については後述する相対パスで指定するのでたぶんどこに置いてもいける。


servers.json

{
    "Servers": {
        "1": {
            "Name": "docker_postgres",
            "Group": "docker_postgres_group",
            "Host": "postgres_db",
            "Port": 5432,
            "MaintenanceDB": "postgres",
            "Username": "postgres",
            "PassFile": "../../pgpass",
            "SSLMode": "prefer"
        },
        "2": {
            "Name": "docker_postgres_host",
            "Group": "docker_postgres_group",
            "Host": "host.docker.internal",
            "Port": 15432,
            "MaintenanceDB": "postgres",
            "Username": "postgres",
            "PassFile": "../../pgpass",
            "SSLMode": "prefer"
        }
    }
}

"PassFile": "../../pgpass" が最重要ポイント。相対パスになっているっぽい。


pgpass

postgres_db:5432:postgres:postgres:postgres
host.docker.internal:15432:postgres:postgres:postgres

パスワードは hostname:port:database:username:password の形式で書けば良い。
複数DBを1ファイルにも書ける。


微妙にハマるポイントが多く、予想に反して面倒であった。