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

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

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

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

PostgreSQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Docker

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1354閲覧

Docker compose でのPostgresコンテナの作成について

退会済みユーザー

退会済みユーザー

総合スコア0

docker-compose

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

PostgreSQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Docker

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/08/18 14:44

編集2020/08/21 11:06

前提・実現したいこと

AWS EC2 内のDockerでアプリとpostgresを連動させてたいと考えております。
そこでdocker-composeでpostgresコンテナを動かしたいのですが、コンテナ作成時に指定したユーザーが生成されずにアプリが動きません。

docker-compose.yml 一部抜粋

version: '3' services: Core: build: ./ image: aspnetapp:Core container_name: app ports: - 80:80 environment: - ConnString postgres: container_name: my-postgres image: postgres:11.5 ports: - 5432:5432 environment: - PGDATA=/var/lib/postgresql/data - POSTGRES_USER - POSTGRES_PASSWORD - PGPASSWORD - POSTGRES_DB - DATABASE_HOST - POSTGRES_INITDB_ARGS= --encoding=UTF-8 volumes: - ./initDB:/docker-entrypoint-initdb.d

ec2 amazon Linux2 環境変数

ConnString='DB接続文字列' POSTGRES_USER='ユーザー名' POSTGRES_PASSWORD='パスワード' PGPASSWORD='パスワード' POSTGRES_DB='DB名' DATABASE_HOST='IPアドレス'

私の認識ではimagesをビルド後、POSTGRES_USERで指定したユーザーが生成される認識なのですが、間違ってますでしょうか。
コンテナに入ってユーザーを確認しましたが、いませんでした。

また、ユーザー・パスワードを「postgres」にするとアプリは問題なく動きます。

すいませんが、ご教授お願いいたします。

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

指定したユーザーが生成されずアプリ側で使用するDB接続文字列に指定したユーザーを記述しているのでエラーになります。

やりたいこと

docker-compose.ymlで設定したユーザを生成し、そのユーザーでアプリからpostgresに疎通したい。

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

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

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

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

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

yu_1985

2020/08/18 18:33

postgresのコンテナをビルドするときの処理が書いていないので、環境変数を渡せばやってくれるのかどうかは判断できないです。 抜粋ではなく、docker-compose.ymlをちゃんと貼るのと、postgresのコンテナをDockerfileで定義しているならそれも貼るべきかと。
退会済みユーザー

退会済みユーザー

2020/08/19 01:04 編集

docker-compose.yml修正しました。 コンテナ内にも指定した環境変数は存在していることは確認済です。 気になるのが「postgres」というユーザーであれば上手くいくところなんですよね。。
yu_1985

2020/08/19 03:05

DockerHubにあるpostgresイメージのドキュメント見ると指定はそれでよさそうですが…。 docker-compose buildでコンテナ作り直してもそうなりますか?
退会済みユーザー

退会済みユーザー

2020/08/19 05:42

docker-compose buildしたのですがそうなりました。。 ユーザー・パスを「postgres」にすればdocker-compose up -d --buildしたときアプリとpostgresのコンテナがrun状態になるのですが、任意のユーザーにしてdocker-compose up -d --buildするとpostgresの コンテナだけ実行状態にならないといった違いがあるんですよね。。。
yu_1985

2020/08/19 06:21

よくわかりませんね…。 一応、どこ見るかわからないといけないのでdockerhubのリンクを貼っておきます。 https://hub.docker.com/_/postgres docker-composeを使わずにコンテナをビルドして見るとどうなりますかね? あと、/docker-entrypoint-initdb.d/init-user-db.sh の内容が気になります。 もしかするとそこで環境変数を渡せていない…?
退会済みユーザー

退会済みユーザー

2020/08/19 08:03

無理でした。。。。 /docker-entrypoint-initdb.dに置いているsqlのOWNER がpostgresになってたので変更すると 無事にdocker-compose up -d --buildするとちゃんとコンテナはrun状態になりました! ただ、やはり指定したユーザーが作成されておらずで。。。。。。
退会済みユーザー

退会済みユーザー

2020/08/19 08:07

1.docker-compose up -d --build 2. アプリとpostgresのコンテナがdoneになる 3.postgresのコンテナに入る 4.psql -U 指定したユーザー role "指定したユーザー" does not existになる って流れです今。。。
yu_1985

2020/08/19 08:10

環境変数を渡すべきところで渡せていないんでしょうか…。 DockerHubの説明を見ると環境変数を指定するだけで良さそうではあるんですが、ビルド時にそれがうまく渡っていない可能性があります。 > ./initDB:/docker-entrypoint-initdb.d 仮にここを指定しないでやるとどうなりますかね?
退会済みユーザー

退会済みユーザー

2020/08/19 08:33

無理でした。。。。。すいません postgresのユーザーであればいけるんですよね。。。 指定したDBの作成もテーブルも作成できていたので。 なので環境変数の値の渡し方であったり、DB初期化方法は問題ないと考えております。。 んー嵌りますww
yu_1985

2020/08/19 08:54

postgresユーザでpsql接続してpg_userかpg_shadowを見てユーザが出来ているかどうか確認してみましょうか。 そういえば > DATABASE_HOST='IPアドレス' としていますが、ここのIPアドレスは何のIPアドレスを入れてるんでしょうか
退会済みユーザー

退会済みユーザー

2020/08/19 10:41 編集

そもそも指定したユーザーでコンテナを構築すると、psqlが使えない状態となってました。。 FATAL: role "root" does not exist たぶんpostgresのコンテナが上手く作れてないんですね。。。 doneにはなるんですけど DATABASE_HOSTにはEC2のローカルIPを入れています。
退会済みユーザー

退会済みユーザー

2020/08/19 10:16

DATABASE_HOST ちょっと違和感がありますね。。
yu_1985

2020/08/20 15:06

> そもそも指定したユーザーでコンテナを構築すると、psqlが使えない状態 それはちょっとわかりません…。 使えないとはどういう状態でしょう。 コンテナに入ってpsqlコマンドを打つことができないということでしょうか?
yu_1985

2020/08/20 15:55

試しにpostgres以下だけをdokcer-compose.ymlにして実行してみて、コンテナに入ってpsqlでデータベースに接続を試みたらできました。 environmentはファイル内に直書きですが。 psqlコマンドに適切にオプションを設定してみてください。 localhostがホスト、ユーザはhoge、データベースはtestで、このあと環境変数で設定したパスワードを入力して接続詞ています。 psql -h localhost -W -Uhoge -d test
dameo

2020/08/20 22:22

@質問者様 長くてザッとしか見てませんが、 「docker-compose.ymlで設定したユーザを生成し、そのユーザーでアプリからpostgresに疎通したい。」 これがとても曖昧に感じました。 ・ホスト側のLinuxユーザー名 ・ホスト側のLinuxユーザーID ・コンテナ側のLinuxユーザー名 ・コンテナ側のLinuxユーザーID ・コンテナ側のPostgreSQL内のユーザー識別名 これらを区別してお話してください。
退会済みユーザー

退会済みユーザー

2020/08/21 11:04

>yu_1985さん ご返事遅れました、すいません。 すいません、指定したユーザーでpostgresのコンテナに入ることが出来ました。テーブルも作成できました。ちょっとGUIに慣れてるせいでCUIに疎くてすいません。。 ただエラーは変わらずです。。。 調査した結果、postgresコンテナの/var/lib/postgresql/の権限がpostgresになっており、POSTGRES_USERに指定したユーザーでは参照出来ないとう目星を立てました。 「postgres」というユーザーなら上手くアプリが動作するのもこれが原因じゃないかと思いました。 アプローチがわからず、詰まっておることには変わりはないですが。。 docker-compose.ymlも最新にしておきます。
dameo

2020/08/21 14:06

無視されちゃったようですが、他の方のために一応書いておきます。 POSTGRES_USERに設定された値は、initdbのパラメータに渡され、postgres内のユーザー識別名としての`postgres`が指定されたユーザー名になっただけです。つまり、POSTGRES_USERをtestにして(DBが作成されてない状態で)コンテナを起動すると root@a2c3d0b7da3f:/# psql -U test -d postgres psql (11.5 (Debian 11.5-3.pgdg90+1)) Type "help" for help. postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- test | Superuser, Create role, Create DB, Replication, Bypass RLS | {} postgres=# となるというだけの話ですよ。やりたいことを明確にしたくないのならそれは質問者様の自由ですけどね。
退会済みユーザー

退会済みユーザー

2020/08/21 15:20

yu_1985さん dameoさん すいません! 解決しました! 環境変数ConnStringのシングルクォートを消したらいけました。。 取り急ぎ共有させていただきます。 今回初めてデプロイしてるので、無意味なアプローチしてしまい、皆さんにご迷惑かけました。 本当にありがとうございました。
dameo

2020/08/21 15:26

迷惑をかけたと思うのであれば、誰にでも意味の通る正確な記述を回答に記述して自己解決にしておいてください。きっとPostgreSQL内のユーザー識別名(role)を指定したかっただけで、スーパーユーザーにする必要があったのかも疑問ですが、.NET側からの接続文字列指定でそのユーザー識別名を間違えただけなのに、postgres側を疑ってさらにいろいろ間違えてたってことなんでしょうね。
guest

回答1

0

ベストアンサー

まとめ
実現したかったことは、POSTGRES_USERをコンテナ構築時に作成し、そのユーザーをDB接続文字列に指定しアプリからpostgresに接続し、対話することでした。

純粋に環境変数のDB接続文字列に不要なシングルクォートがあり、それが原因でアプリ側でエラーが出ていた。

エラー内容は、

format of the initialization string does not conform to specification starting at index X

上記のエラーを調べると、2パターン原因がありそうだった。
1.DB接続文字列のフォーマットミス
2.postgresコンテナの/var/lib/postgresql/dataの権限

1はローカルPC(Windows)のDockerで既に動作確認しており、そこから環境変数をコピーしたので
ある程度、担保されていたので2の方でアプローチしたが、泥沼に嵌り、結局1を疑う。→解決。

投稿2020/08/21 16:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問