😸
Docker環境でpgAdminを利用する際、接続先を自動設定する
概要
- 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つ
- 公式イメージでコンテナ起動後、
docker exec
等で権限を設定(趣旨に合わないの見送り) - カスタムイメージを作成し、
dockerfile
でファイルのコピーと権限設定を行う(再現性が高いのでこちらを採用)
修正ファイル(一部のみ記載)
-
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ユーザが読み込めるように設定
-
-
.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