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

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

新規登録して質問してみよう
ただいま回答率
85.44%
PostgreSQL

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

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

3357閲覧

Docker postgresへdieselから接続できない。

I_am_

総合スコア23

PostgreSQL

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

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/10/20 06:41

編集2021/10/20 17:22

前提・実現したいこと

Docker で作成したpostgresへrustのORMツールであるdieselからアクセスできない。

作成したpostgres

docker run \ --name rust-db \ -e POSTGRES_PASSWORD=mypassword \ -p 5433:5432 -d \ -v postgres-tmp:/var/lib/postgresql/data \ -e POSTGRES_HOST_AUTH_METHOD=trust \ postgres:12.3-alpine

こちらのDockerイメージをrunしました。

その後に、RUSTのORMマッパーであるDieselをインストールしてdisel setup commandをしました。

[dependencies] actix-files = "0.5.0" actix-web = "3.3.2" handlebars = { version = "3.0.1", features = ["dir_source"] } serde_json = "1.0.68" diesel = { version = "1.4.1", features = ["postgres"] } dotenv = "0.15.0" .env DATABASE_URL=postgres://postgres:mypassword@localhost/project_name

発生している問題・エラーメッセージ

Creating migrations directory at: rust/rust-training/02catdex/migrations Creating database: FATAL: password authentication failed for user "postgres"

分からないこと・教えて欲しいこと

・POSTGRES_HOST_AUTH_METHOD=trust
こちらの設定によって、authenticationはパスできると思っていたのですが、エラーになってしまいます。
どこが原因
diesel側かDocker側かで切り分けもできていなくてどのように解決していくかご教授お願いします。

https://www.koikikukan.com/archives/2020/06/03-235555.php
を参考にしてDockerの中に入って設定をしようとしたのですが、
Docker alpine 環境でVIMエディターが入ってなかったりしてつまづいてます。

・初歩的で申し訳ないのですが、apline環境の場合にファイルの書き換えを行う場合にはどのようにすればいいのですか?

新しく, trustに変えてみました。

# "local" is for Unix domain socket connections only local all all trust

編集

わかりやすくするために、docker-compose.ymlを使用して起動しました。
docker-compose.yml

version: "3" services: postgresql: image: postgres:12.3-alpine container_name: rust-db ports: - 5433:5432 volumes: - ./pg-tmp:/var/lib/postgresql/data environment: POSTGRES_USER: user1 POSTGRES_PASSWORD: mypassword POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_HOST_AUTH_METHOD: trust hostname: postgres restart: always .env DATABASE_URL=postgres://user1:mypassword@localhost:5433

返ってくるエラー
user1ではなくてuser "postgres"に接続がされている。

diesel setup Creating database: FATAL: password authentication failed for user "postgres"

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

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

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

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

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

guest

回答1

0

ベストアンサー

たぶん、間違ったPostgreSQLサーバーにつながっているのかと思います。

docker runコマンドではPostgreSQLのlocalhostのポートとしてポート5433を指定しています。しかしDiesel setupコマンドのDATABASE_URLではポートを指定していないため、デフォルトのポート5432に接続しようとしているはずです。きっと、localhostのポート5432で別のPostgreSQLサーバーが動いていて、パスワードが異なるのでエラーになっているのでしょう。

DATABASE_URLにポートの指定を追加してみてください。多分、以下のようにすればいいと思います。

console

1.env 2DATABASE_URL=postgres://postgres:mypassword@localhost:5433/project_name

もしこれでもダメなら、切り分けとして、PostgreSQL側に問題がないか確認してみてください。

console

1## Dockerコンテナー「rust-db」のIPアドレスを調べる 2$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rust-db 3172.17.0.2 4 5## 別のコンテナーでpsqlを起動し、上で得たIPアドレスへ接続してみる 6## Dockerコンテナー同士で接続する際は、ポート5432になることに注意 7$ docker run -it --rm postgres:12.3-alpine \ 8 psql -h 172.17.0.2 -p 5432 -U postgres 9Password for user postgres: mypassword 10psql (12.3) 11Type "help" for help. 12 13postgres=#

このように接続できる場合は、PostgreSQL側は問題ないと考えて良いと思います。

Docker alpine 環境でVIMエディターが入ってなかったりしてつまづいてます。

Alpine Linuxではパッケージはapkコマンドでインストールできますので、それを使ってvimをインストールしてください。

console

1## Dockerコンテナー「rust-db」内でbashを実行する 2$ docker exec -it rust-db bash 3 4# apkでvimをインストールする 5bash-5.0# apk update 6bash-5.0# apk add vim

投稿2021/10/20 11:15

tatsuya6502

総合スコア2035

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

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

I_am_

2021/10/20 17:37 編集

回答感謝します。 自分の環境でも、コンテナ間の接続を試したところ、接続ができました。 ローカルでpostgresが5432で動いているのでそちらに向けられていることが問題だと思います。 .envで向き先を指定しているのにもかかわらずローカルに向いてしまう原因が何故かわからないです、、 1点心当たりがあり、exportコマンドでDATABASE_URL=の環境変数を打ってしまったような気がしています。
I_am_

2021/10/20 17:37

ありがとうございます。 問題点の切り分けをすることができました。 exportコマンドで環境変数を定義していたみたいです、、 ``` printenv |grep DATABASE_URL DATABASE_URL=postgres://postgres:mypassword@localhost ```
tatsuya6502

2021/10/21 00:39

> .envで向き先を指定しているのにもかかわらずローカルに向いてしまう原因が何故かわからないです、、 質問の「編集」の部分を、いま読みました。なるほど。.envで正しいURLを指定しても接続できなかったのですね。 > 問題点の切り分けをすることができました。 > exportコマンドで環境変数を定義していたみたいです、 原因がわかり、解決してよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問