web-dev-qa-db-ja.com

Docker-postgresの準備ができているかどうかを確認します

Kong API Gateway コンテナと postgres コンテナがあり、移行を実行する前に、postgresが起動してKongコンテナから準備ができているかどうかを確認する必要があります。 DockerfileでRUN yum install postgresql -y && yum clean allを使用し、psqlまたはpg_isreadyを使用して、公式のKongイメージに基づくカスタムイメージにpostgresクライアントユーティリティをインストールすることを考えていました。これら2つのユーティリティでサーバーのステータスを確認するために、空のパスワードを使用してpollingというpostgresユーザーを作成しました。どちらも機能しません。

カスタムKongイメージから次のコマンドを実行しようとしました。

  1. psql。コマンドpsql -h postgres -U polling -w -c '\l'は、エラーpsql: fe_sendauth: no password suppliedで失敗します。しかし、ユーザーはパスワードを持っていません。私は何が間違っているのですか?サーバーがpsqlを使用して準備ができているかどうかをチェックする完全なシェルスクリプトについて説明します ここ

  2. pg_isready。このユーティリティを公式のKongイメージに基づくカスタムイメージに個別にインストールする方法がわかりません。カスタムイメージはcentos:7イメージに基づいており、postgresqlパッケージにはpg_isreadyが含まれていません。これらのユーティリティのみがインストールされ、/usr/binにあります:pg_configpg_dumppg_dumpallpg_restorepsqlpg_isreadyをインストールするにはどうすればいいですか? Kongイメージにサーバー全体をインストールしたくありません。

5
super.t

私の解決策は、公式のコング画像に基づいて新しい画像を作成し、次のようにエントリポイントをオーバーライドすることでした。

#!/usr/bin/env bash
set -e

# Disabling nginx daemon mode
export KONG_NGINX_DAEMON="off"

# Setting default prefix (override any existing variable)
export KONG_PREFIX="/usr/local/kong"

# Prepare Kong prefix
if [ "$1" = "/usr/local/openresty/nginx/sbin/nginx" ]; then
    kong prepare -p "/usr/local/kong"
fi

#waiting for postgres
until psql --Host=$KONG_PG_Host --username=$POLLING_USER $POLLING_DATABASE -w &>/dev/null
do
  echo "Waiting for PostgreSQL..."
  sleep 1
done

echo "Postgres is ready, running the migrations..."

kong migrations up

echo "READY TO START UP KONG USING CMD" $@;

exec "$@"
4
super.t

これは、PGツールを使用せずに単純なTCPポート5432でチェックします。wait-for-it.sh、そしてそれはうまく機能します。 Postgresはサーバーが実際にサービスを提供する準備ができるまでポートを開かないので、これは明らかに問題ありません。

サンプルDockerfile: https://github.com/apim-haufe-io/wicked.kong/blob/master/Dockerfile

対応する開始スクリプト(この特定の問題では最後の行のみが興味深い): https://github.com/apim-haufe-io/wicked.kong/blob/master/startup.sh

スニペット:

wait-for-it.sh -h $KONG_PG_Host -p 5432 -t 30 -- kong start --run-migrations

それを待つ: https://github.com/vishnubob/wait-for-it

6
donmartin

Wait-for-itを試しましたが、Dockerイメージがインストールされていない可能性があるため(ping、telnet、curlなどがない場合もあります)、Dockerコンテナーで実行すると問題が発生する可能性があります。したがって、DBが稼働しているかどうかを確認するために、Docker構成ファイルでHealthCheckを使用しました。これは、postgresデータベースの一部であるpg_isreadyの戻り値をチェックしていたため、Dockerイメージに何もインストールする必要はありません。

version: '2.3'
services:
  postgres-db:
    image: postgresImage
    healthcheck:
      test: /usr/bin/pg_isready
      interval: 5s
      timeout: 10s
      retries: 120
    ports:
      - '5432:5432'

  aplication:
    image: applicationImage
    depends_on:
      postgres-db:
        condition: service_healthy
2
Thuthu