Kong API Gateway コンテナと postgres コンテナがあり、移行を実行する前に、postgresが起動してKongコンテナから準備ができているかどうかを確認する必要があります。 DockerfileでRUN yum install postgresql -y && yum clean all
を使用し、psql
またはpg_isready
を使用して、公式のKongイメージに基づくカスタムイメージにpostgresクライアントユーティリティをインストールすることを考えていました。これら2つのユーティリティでサーバーのステータスを確認するために、空のパスワードを使用してpolling
というpostgresユーザーを作成しました。どちらも機能しません。
カスタムKongイメージから次のコマンドを実行しようとしました。
psql。コマンドpsql -h postgres -U polling -w -c '\l'
は、エラーpsql: fe_sendauth: no password supplied
で失敗します。しかし、ユーザーはパスワードを持っていません。私は何が間違っているのですか?サーバーがpsqlを使用して準備ができているかどうかをチェックする完全なシェルスクリプトについて説明します ここ 。
pg_isready。このユーティリティを公式のKongイメージに基づくカスタムイメージに個別にインストールする方法がわかりません。カスタムイメージはcentos:7
イメージに基づいており、postgresql
パッケージにはpg_isready
が含まれていません。これらのユーティリティのみがインストールされ、/usr/bin
にあります:pg_config
、pg_dump
、pg_dumpall
、pg_restore
、psql
。 pg_isready
をインストールするにはどうすればいいですか? Kongイメージにサーバー全体をインストールしたくありません。
私の解決策は、公式のコング画像に基づいて新しい画像を作成し、次のようにエントリポイントをオーバーライドすることでした。
#!/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 "$@"
これは、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
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