質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

0回答

1250閲覧

DockerでrailsからpostgreSQLへの接続がうまくいかない

tokumon10

総合スコア6

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/03/17 14:46

編集2021/03/19 12:19

個人学習でアプリを作成しており、そのアプリにDockerを導入しようと試みているのですが、dbにうまく接続ができず行き詰まっております。

環境

Docker version 20.10.2
Mac OS BigSur 11.2.3
Rails 6.1.3
Ruby 2.6.5

エラー内容

db_1 | 2021-03-17 14:31:47.077 UTC [34] FATAL: password authentication failed for user "myapp" db_1 | 2021-03-17 14:31:47.077 UTC [34] DETAIL: Role "myapp" does not exist. db_1 | Connection matched pg_hba.conf line 99: "host all all all md5"

以上のエラーが出ており、認証周りのエラーと推測できるのですが、
docker-compose.yml

version: '3' services: db: image: postgres:13.1 restart: always ports: - '5432:5432' volumes: - postgres-data:/var/lib/postgresql/data environment: POSTGRES_USER: "myapp" POSTGRES_PASSWORD: "password" POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_DB: new_book web: build: context: . dockerfile: Dockerfile command: bundle exec rails s -p 3000 -b '0.0.0.0' tty: true stdin_open: true depends_on: - db ports: - "3000:3000" volumes: - .:/myproject volumes: postgres-data:

database.yml

default: &default adapter: postgresql pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 encoding: utf8 username: "myapp" password: "password" development: <<: *default database: MyApp_development host: db test: <<: *default database: MyApp_test host: db

以上のように設定してありログインの情報は正しいように思われます。

Dockerを初めて使用し、どの観点からエラーを解決していけばよいかよくわからないため、知見のある方いらっしゃいましたらお力を貸していただけますと幸いです。
よろしくお願いいたします。

追記

dbコンテナ接続してユーザーが存在するか確認を行なったところ、myappユーザが存在しなかっただけでなくデフォルトのpostgresユーザーも存在しなかったためpsqlサーバーにログインができない状況となってました。
docker-compose.ymlのenvironmentを一旦削除してコンテナを立ち上げるなど行なったのですがどの方法でもユーザーが存在しないというエラーが返ってきます。

% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 432e388e548e postgres:13.1 "docker-entrypoint.s…" About a minute ago Up 10 seconds 0.0.0.0:5432->5432/tcp new_book_db_1 8b42969bd8d0 new_book_web "bundle exec rails s…" 23 hours ago Up 9 seconds 0.0.0.0:3000->3000/tcp new_book_web_1

docker-compose up -dで上記のコンテナを起動した状態で、

% docker exec -it 432e388e548e bash root@432e388e548e:/# psql -U myapp psql: error: FATAL: role "myapp" does not exist root@432e388e548e:/# psql -U postgres psql: error: FATAL: role "postgres" does not exist

dbコンテナに接続してpsql -U myappとpsql -U postgresを行いました。

コンテナが作成されpostgresサーバーが始動する時、どこを参照してroleとpasswordを作成してるか分かればと思ったのですが、よく理解できません。
もしこの情報から分かることございましたら教えていただきたく思います。重ねてお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsuand

2021/03/18 02:15

myapp というユーザーでアクセスできないのですから、psql で myapp ユーザーが存在するか否か、db コンテナーに接続して確認してみたらいかがでしょう。postgres イメージを利用するなら、https://hub.docker.com/_/postgres のドキュメントを一瞥することも必要かと思います。自分でできることはまだいろいろありそうです。
dameo

2021/03/18 19:52

横から失礼します。何をしてどうなったかは、正確に書かないと相手に伝わりませんよ。 追記分を見ましたが、「dbコンテナ接続」の方法は、 docker-compose up -d した状態から docker-compose exec db bash をしたということでしょうか? 「ユーザーが存在するか確認」、とは上記のようにコンテナ接続してから # psql -U myapp -d new_book をした、ということでしょうか? その場合に、「myappユーザが存在しなかった」と判断した理由は何ですか? 「デフォルトのpostgresユーザーも存在しなかった」と判断した理由は何ですか? 大変お手数をおかけして申し訳ありませんが、全てコマンドのログとして記述する形に質問を修正して頂けないでしょうか? ※なお、上記方法で確認している場合、railsからのアクセスと認証方式(md5)が異なります。 手元で元のdocker-compose.ymlを編集し、サービスdbをコピーしてdb2を作り、サービスwebを消し、docker volumeを作らずに、ローカルディレクトリをmountしたところ、 version: '3' services: db: image: postgres:13.1 restart: always ports: - '5432:5432' volumes: - ./data:/var/lib/postgresql/data environment: POSTGRES_USER: "myapp" POSTGRES_PASSWORD: "password" POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_DB: new_book db2: image: postgres:13.1 restart: always ports: - '5433:5433' volumes: - ./data2:/var/lib/postgresql/data environment: POSTGRES_USER: "myapp2" POSTGRES_PASSWORD: "password2" POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_DB: new_book2 ※コメント欄では行先頭の空白が消えます そしてコンテナを起動し、 $ docker-compose up -d db2側のコンテナに接続し、 $ docker-compose exec db2 bash psqlでdbに接続したところ、ちゃんと接続できました。 root@d0f5b440df8f:/# psql -h db -U myapp -d new_book Password for user myapp: psql (13.1 (Debian 13.1-1.pgdg100+1)) Type "help" for help. new_book=# docker-compose.ymlは問題なさげに見えます。なので現状可能性的には、確認手順がおかしいか、volumeが壊れている、のような状況が想定されます。いずれにしてもまずは質問の修正をして頂いてから、それを元に原因を究明することが必要です。
tokumon10

2021/03/19 12:24

dameo様/matsuand様 ご指摘ありがとうございます。 追記がとても曖昧で何をしたかわかりづらくて申し訳ありませんでした。 実施コマンドを追加させていただきました。その後も何度かコンテナを消しては作ってを行ってみたのですがどうにもうまくいきません。 dameo様がおっしゃっている様にvolumeが仮に壊れてる場合はどこを確認し修正を行えばよろしいですか? 質問ばかりで大変恐縮ですがご助力いただけますでしょうか。
dameo

2021/03/19 13:39 編集

修正した質問拝見しました。 方法としては、私が前回コメントしたときの最初に紹介した方法とほぼ同じことをしていますね。 この方法は、ローカル接続(unix-domain socket)なので、コンテナ内で # cat /var/lib/postgresql/data/pg_hba.conf すれば分かるとおり、 local all all trust 認証を行わずに接続ユーザーをロールとして使用する方式になります。 psqlを引数なしで接続するとlinuxユーザー名のrootになり、-Uオプションで指定してる場合、そのユーザー名をロールとして使用する方式になります。 つまり、今の状況は、myappでも、postgresでもないロールがあるということです。 ちなみに先に私が挙げたdocker-compose.ymlで $ docker-compose up -d $ docker-compose exec db bash root@feb1f3f8e5e6:/# psql -U myapp -d new_book psql (13.1 (Debian 13.1-1.pgdg100+1)) Type "help" for help. new_book=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- myapp | Superuser, Create role, Create DB, Replication, Bypass RLS | {} new_book=# となっています。 このロールはinitdbで作られてるはずなので、きちんと出来ているのであれば、初回実行時にmyappでもpostgresでもないロールが作られているはずです。そうでない場合は、databaseができておらず、起動も失敗しているでしょう。 まずは、databaseは起動しているのでしょうか? docker-compose upを-dせずに起動して、正常に起動しているかどうかを見てください。 正常に起動している場合は、初回の起動時に作られてると思うので、ご自分でdocker-compose.ymlに入力した内容を思い出して、何か別の名前を指定しなかったか、手当たり次第ご確認ください。 どうしても分からない場合は、一旦コンテナ上の /var/lib/postgresql/data に使われているvolumeを削除して起動すれば、次回dockerコンテナ起動時に動作するスクリプト(/docker-entrypoint.sh)からdatabaseが構築されるはずです。 勝手な意見で恐縮ですが、今後のためにも、dockerをもう少し使えるようになってから、またpostgresqlの理解を深めてから、ご自身のアプリにご活用された方が良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問