##経緯
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/18 13:14