はじめに
- この記事では先日遭遇したエラーに関しての原因とその解決策を備忘録として残しておきます。
目次
1. 遭遇したエラーの詳細
2. 原因特定の旅
3. 原因
4. 解決策
遭遇したエラーの詳細
-
ある日、EC2インスタンスのUbuntuサーバーでDockerを使用してpgAdminを立ち上げたのでそこにアクセスしようとしました。
しかし、以下のように「アクセスしています」状態のまま20分ほどアクセスできずにいました。
これは何かおかしいと感じてエラー発見の旅に出ました。
原因特定の旅
- まずはpgAdminをDockerで立ち上げているので以下のコードでDocker関連でエラーが出ていないかログを確認しました。
docker logs <pgAdminを立ち上げているコンテナ名>
これは要約するとDocker側がホスト側(ここではUbuntuサーバーのこと)にpgAdmin用のフォルダを作成したいけど権限がなくてフォルダが作成できないよ!といわれています。
Linuxでは「UID」という整数でユーザーを管理しています。
ここで起きている問題としては、ホスト上のフォルダをとあるユーザー(仮にUID = 1000)が所有していて、コンテナ側のプロセスがとあるユーザー(仮にUID=5050)としてファイルに書き込みを試みると、数値が一致しないため「他人が所有しているフォルダ」となり、書き込み権限を持たない → Permission denied が起きる、という具合です。
原因
- つまり原因としてはDocker側とホスト側の管理者ユーザーが一致しないことが原因のようなのでそれを一致させてあげればいいようです。
そもそもdocker-compose.ymlファイルの時点で以下のようにこのコンテナのユーザーをルートユーザーと一致させるようにする設定もできるみたいです。
user: root
しかし、この方法はセキュリティ的な観点からあまり推奨できるような方法ではありません。
解決策
-
解決策の方向性としてはpgAdminコンテナのユーザーに対して書き込みの権限を与えてあげます。
そのためにpgAdminのコンテナのユーザーIDを知る必要があるのでまずはそのユーザーIDを取得するためのコマンドを打ち込みます。docker exec -it <pgadminのコンテナ名> id
そして取得したpgadminコンテナのUIDを基にDocker側がファイルを作成しようとしている親フォルダのUIDを変更してあげます。
sudo chown -R <pgadminのUID>:<pgadminのUID> ./docker/pgadmin
そして以下のコマンドを使用して読み書きの権限を付与してあげます。
sudo chmod -R 770 ./docker/pgadmin
ここまで行えばユーザーが一致して正しくpgAdminにアクセスすることができるようになっているはずです。
まとめ
- この記事ではホスト側とDockerのコンテナ側のUIDを一致させる方法に関してまとめました。個人開発の段階ではあまりUIDを分割する必要性を感じませんが、大規模開発では必要性が高まりそうです。