centos Docker -检查postgres是否准备就绪

vvppvyoh  于 4个月前  发布在  Docker
关注(0)|答案(5)|浏览(71)

我有一个Kong API Gateway容器和一个postgres容器,在运行迁移之前,我需要检查Postgres是否已经从Kong容器启动并准备就绪。我正在考虑使用Dockerfile中的RUN yum install postgresql -y && yum clean all将postgres客户端实用程序安装到基于官方Kong映像的自定义映像中,并使用psqlpg_isready来实现这一点。我已经创建了一个名为polling的postgres用户使用一个空密码专门用于通过这两个实用程序检查服务器的状态。它们都不起作用。
我尝试从自定义的Kong镜像执行这些命令:
1.psqlpsql -h postgres -U polling -w -c '\l'命令失败,错误为psql: fe_sendauth: no password supplied。但用户没有密码。我做错了什么?完整的shell脚本检查服务器是否准备好使用psql描述为here
1.pg_isready.我不知道如何将此实用程序单独安装到基于官方Kong镜像的自定义镜像中,而官方Kong镜像又基于centos:7镜像,postgresql包不包括pg_isready。只有这些实用程序安装在/usr/bin中,并且可以找到:pg_configpg_dumppg_dumpallpg_restorepsql .如何安装pg_isready?我不想在Kong镜像中安装完整的服务器。

vc6uscn9

vc6uscn91#

这里是一个shell one liner使用的pg_isready工具提供的PostgreSQL。
要调用外部Docker,请执行以下操作:

DOCKER_CONTAINER_NAME="mypgcontainer"
timeout 90s bash -c "until docker exec $DOCKER_CONTAINER_NAME pg_isready ; do sleep 5 ; done"

字符串
Based on a post from Jeroma Belleman的一个。

i7uq4tfw

i7uq4tfw2#

我试过wait-for-it,但在docker容器中运行它可能是一个问题,因为docker镜像可能没有安装nc(有时甚至没有ping,telnet,curl..)。所以为了检查数据库是否正常运行,我在docker compose文件中使用了HealthCheck,检查pg_isready的返回值,这是postgres数据库的一部分,所以你不需要在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

字符串

klh5stk1

klh5stk13#

我们通过在端口5432上进行简单的TCP检查来解决这个问题,而不需要任何PG工具。我们只使用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

whlutmcx

whlutmcx4#

我的解决方案是基于官方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 "$@"

字符串

lrpiutwd

lrpiutwd5#

正如几个答案所提到的,使用pg_isready是一个很好的方法。
但是,如果您的映像可能正在通过/docker-entrypoint-initdb.d中的脚本加载数据或执行其他初始化工作,则此测试将在该阶段成功,即使数据库尚未真正“就绪”。
在初始化过程中,postgres只能通过UNIX套接字访问,因此测试将失败,直到服务器关闭并在包含TCP访问的“生产”配置中重新启动。

相关问题