😸

Docker環境でpgAdminを利用する際、接続先を自動設定する

2024/10/14に公開

概要

  • postgreSQL接続時に毎回パスワードを要求されるため、自動ログインを設定した際の備忘録
  • なぜかパスワードファイルが取得できないって人が対象
  • 参考となる記事もなかったため記事にします。

環境

  • agAdminバージョン8.12
  • postgreSQLバージョン16.2

先に解決方法

  • パスワードファイルの権限が緩い場合、システムはファイルを無視する

  • カスタムイメージをビルドしてpgadminパスワードファイルが読み込めるよう権限を設定する

    dockerfile
    # ホストの .pgpass ファイルをコンテナ内にコピー
    COPY .pgpass /home/pgadmin/.pgpass
    
    # ファイルの権限を設定(所有権の関係上一時的にrootにスイッチ)
    USER root
    RUN chown pgadmin:root /home/pgadmin/.pgpass
    USER pgadmin
    RUN chmod 600 /home/pgadmin/.pgpass
    

事象

  • DBに接続しようとしたところ、以下のエラーが発生

    パスワードが供給されていない(直訳)

  • ログを確認するとパスワードファイルの権限に関する警告が出ていた

    WARNING: password file "/pgpass" has group or world access; permissions should be u=rw (0600) or less
    ERROR      pgadmin:        Could not connect to server(#1) - 'container_postgres'.
    Error: connection failed: connection to server at "172.26.0.2", port 5432 failed: fe_sendauth: no password supplied
    

調査

  • どうやら権限がゆるすぎるとファイルが無視されるらしい

    Unixシステムにおいて、パスワードファイルの権限はグループ、他者へのアクセスをすべて拒否しなければなりません。
    これはchmod 0600 ~/.pgpassといったコマンドによって行います。
    権限をこれよりも緩くすると、このファイルは無視されます。
    https://www.postgresql.jp/document/11/html/libpq-pgpass.html

  • docker-composeでどうにかできないかと試みるが、Windows環境ではマウントしたファイルの権限を変更できないらしい(頑張ればできる)

    [LinuxOSコンテナ] mountされたvolumeに対してchmod/chownが効かない
    https://hblog.brains-tech.co.jp/entry/docker-lcow

解決策

解決策は2つ

  1. 公式イメージでコンテナ起動後、docker exec等で権限を設定(趣旨に合わないの見送り
  2. カスタムイメージを作成し、dockerfileでファイルのコピーと権限設定を行う(再現性が高いのでこちらを採用

修正ファイル(一部のみ記載)

  1. dockerfile

    dockerfile
    # ホストの .pgpass ファイルをコンテナ内にコピー
    COPY .pgpass /home/pgadmin/.pgpass
    
    # ファイルの権限を設定(所有権の関係上一時的にrootにスイッチ)
    USER root
    RUN chown pgadmin:root /home/pgadmin/.pgpass
    USER pgadmin
    RUN chmod 600 /home/pgadmin/.pgpass
    
    • /home/pgadmin/・・・pgadminユーザが読み込めるように設定
  2. .pgpass(dockerfileと同じ階層に配置)

    container_postgres:5432:*:postgres:password
    

確認


最初に成功したとき声出た

最後に

教訓を得た

  • パスワードファイルは権限を正しく設定すること
  • ログは確認すること
  • 実行ユーザも確認すること

おまけ(コンテナに手動でログインして権限を設定する)

docker exec --user root container_pgadmin mkdir /home/pgadmin
docker cp ./.pgpass container_pgadmin:/home/pgadmin/.pgpass
docker exec --user root container_pgadmin chown pgadmin:root /home/pgadmin/.pgpass
docker exec container_pgadmin chmod 600 /home/pgadmin/.pgpass

Discussion