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

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

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

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

PostgreSQL

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

Docker

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

Q&A

解決済

1回答

3317閲覧

docker-compose upで「psql: not found」エラー

fukazume

総合スコア78

docker-compose

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

PostgreSQL

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

Docker

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

0グッド

0クリップ

投稿2020/09/18 05:21

編集2020/09/18 05:35

##経緯
Control startup and shutdown order in Compose
上記のDocker公式で紹介されている、wrapper scriptによるPostgreSQL起動確認/待機のコマンドを自作のdocker-compose.ymlに移植して実行してみたところ「psql: not found」エラーが発生しました。

##質問
「web」コンテナにpsqlはインストールされていないのでこのエラーは当然だと思うのですが、公式サイトのサンプルスクリプトも「web」コンテナでpsqlコマンドを実行しているという意味では、同じような構成になっているように見えます。

この問題解決の方向性として、docker-compose.yml 内で他コンテナ(=「db」コンテナ)にインストールされているpsqlアプリを実行できれば、このエラーは解消されるのでしょうか?以下、私のソース構成で間違っている点をご指摘いただけますと大変ありがたく存じます。

ご不明な点などは、適宜追記してまいりますので、どうぞよろしくお願い申し上げます。

###■エラー箇所(※詳細ログは、ページ下部をご参照ください)

ERROR

1web_1 | /project01/wait-for-postgres.sh: 14: /project01/wait-for-postgres.sh: psql: not found

 ※不要コメントを削除したのでエラー行は14からズレています。「until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do」がエラー行となります。

###■使用したdocker-compose.yml

dockercompose

1version: "3.7" 2services: 3 web: 4 build: . 5 command: ["./wait-for-postgres.sh", "db", "--", "python", "app.py"] 6 volumes: 7 - .:/project01 8 9 ports: 10 - 8000:8000 11 12 depends_on: 13 - db 14 15 environment: 16 PIPENV_VENV_IN_PROJECT: "true" 17 db: 18 image: postgres 19 environment: 20 POSTGRES_USER: ${POSTGRES_USER} 21 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 22 POSTGRES_DB: ${POSTGRES_DB} 23 POSTGRES_INITDB_ARGS: ${POSTGRES_INITDB_ARGS} 24

###■使用したwait-for-postgres.sh

waitforpostgressh

1#!/bin/sh 2# wait-for-postgres.sh 3set -e 4 5host="$1" 6shift 7 8cmd="$@" 9 10until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do 11 >&2 echo "Postgres is unavailable - sleeping" 12 sleep 1 13done 14 15>&2 echo "Postgres is up - executing command" 16exec $cmd

###■使用したDockerfile

Dockerfile

1FROM python:3.6 2ENV PYTHONDONTWRITEBYTECODE 1 3ENV PYTHONUNBUFFERED 1 4WORKDIR /project01 5COPY Pipfile Pipfile.lock /project01/ 6RUN apt-get update && apt-get upgrade 7RUN pip install pipenv 8RUN pipenv install --system 9COPY . /project01/

###■実行時の詳細ログ

log

1C:\Users\test\dev\project01>docker-compose up 2Creating network "project01_default" with the default driver 3Creating project01_db_1 ... done 4Creating project01_web_1 ... done 5Attaching to project01_db_1, project01_web_1 6db_1 | The files belonging to this database system will be owned by user "postgres". 7db_1 | This user must also own the server process. 8db_1 | 9db_1 | The database cluster will be initialized with locale "en_US.utf8". 10db_1 | The default text search configuration will be set to "english". 11db_1 | 12db_1 | Data page checksums are disabled. 13db_1 | 14db_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok 15db_1 | creating subdirectories ... ok 16db_1 | selecting dynamic shared memory implementation ... posix 17db_1 | selecting default max_connections ... 100 18db_1 | selecting default shared_buffers ... 128MB 19db_1 | selecting default time zone ... Etc/UTC 20db_1 | creating configuration files ... ok 21db_1 | running bootstrap script ... ok 22db_1 | performing post-bootstrap initialization ... ok 23db_1 | syncing data to disk ... initdb: warning: enabling "trust" authentication for local connections 24db_1 | You can change this by editing pg_hba.conf or using the option -A, or 25db_1 | --auth-local and --auth-host, the next time you run initdb. 26db_1 | ok 27db_1 | 28db_1 | 29db_1 | Success. You can now start the database server using: 30db_1 | 31db_1 | pg_ctl -D /var/lib/postgresql/data -l logfile start 32db_1 | 33db_1 | waiting for server to start....2020-09-18 04:47:47.719 UTC [47] LOG: starting PostgreSQL 12.4 (Debian 12.4-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit 34db_1 | 2020-09-18 04:47:47.797 UTC [47] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 35db_1 | 2020-09-18 04:47:48.476 UTC [48] LOG: database system was shut down at 2020-09-18 04:47:43 UTC 36db_1 | 2020-09-18 04:47:48.645 UTC [47] LOG: database system is ready to accept connections 37db_1 | done 38db_1 | server started 39web_1 | ./wait-for-postgres.sh: 15: ./wait-for-postgres.sh: psql: not found 40web_1 | Postgres is unavailable - sleeping 41(ループ、中略) 42web_1 | ./wait-for-postgres.sh: 15: ./wait-for-postgres.sh: psql: not found 43web_1 | Postgres is unavailable - sleeping 44Gracefully stopping... (press Ctrl+C again to force) 45Stopping project01_web_1 ... done 46Stopping project01_db_1 ... done 47

###環境
Windows 10
Docker Engine 19.03.12

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく公式ドキュメントでは、web サービスのイメージに
PostgreSQL クライアントをインストールすることを想定しているものと思われます:

yaml

1services: 2 web: 3 build: .

(もしかしたら postgres のイメージと volume を共有して psql クライアントを使えば解決できるかもしれませんが、僕はやったことがありません)

PostgreSQL クライアントをインストールしたくない場合は
その上の wait-for-it.sh を利用して port のサービス開始を検知する方法で
実装すると良いでしょう:

yaml

1 depends_on: 2 - "db" 3 command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]

これは Shell Script を落としてくるだけでできます:

docker

1RUN wget -O /usr/bin/wait-for-it https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh \ 2 && chmod +x /usr/bin/wait-for-it

wget でなく curlgit でも構いません
Docker イメージのレイヤーが増えますが、ADD を使うと上記のコマンドなしでも設定できます:

docker

1ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /usr/bin/wait-for-it 2RUN chmod +x /usr/bin/wait-for-it

投稿2020/09/18 07:24

編集2020/09/18 17:28
y_shinoda

総合スコア3272

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

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

fukazume

2020/09/18 13:14

多角的に解決方法を教えていただきありがとうございます!Docker公式の例は、やはりpsqlクライアントが入っている前提なんですね!おかげさまでスッキリ理解できました。ご提示いただきましたwait-for-it, wait-for-postgres の両方の方法でpsql起動まで待機してくれることを確認できました!volume共有についてはまだ理解の途中ですが、大変参考になりました!深く御礼申し上げます!m(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問