我有一个Kong API Gateway容器和一个postgres容器,在运行迁移之前,我需要检查Postgres是否已经从Kong容器启动并准备就绪。我正在考虑使用Dockerfile中的RUN yum install postgresql -y && yum clean all
将postgres客户端实用程序安装到基于官方Kong映像的自定义映像中,并使用psql
或pg_isready
来实现这一点。我已经创建了一个名为polling
的postgres用户使用一个空密码专门用于通过这两个实用程序检查服务器的状态。它们都不起作用。
我尝试从自定义的Kong镜像执行这些命令:
1.psql。psql -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_config
,pg_dump
,pg_dumpall
,pg_restore
,psql
.如何安装pg_isready
?我不想在Kong镜像中安装完整的服务器。
5条答案
按热度按时间vc6uscn91#
这里是一个shell one liner使用的
pg_isready
工具提供的PostgreSQL。要调用外部Docker,请执行以下操作:
字符串
Based on a post from Jeroma Belleman的一个。
i7uq4tfw2#
我试过wait-for-it,但在docker容器中运行它可能是一个问题,因为docker镜像可能没有安装nc(有时甚至没有ping,telnet,curl..)。所以为了检查数据库是否正常运行,我在docker compose文件中使用了HealthCheck,检查pg_isready的返回值,这是postgres数据库的一部分,所以你不需要在docker镜像中安装任何东西:
字符串
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
片段:
字符串
标签:https://github.com/vishnubob/wait-for-it
whlutmcx4#
我的解决方案是基于官方kong镜像创建一个新镜像,并像这样覆盖入口点:
字符串
lrpiutwd5#
正如几个答案所提到的,使用
pg_isready
是一个很好的方法。但是,如果您的映像可能正在通过
/docker-entrypoint-initdb.d
中的脚本加载数据或执行其他初始化工作,则此测试将在该阶段成功,即使数据库尚未真正“就绪”。在初始化过程中,postgres只能通过UNIX套接字访问,因此测试将失败,直到服务器关闭并在包含TCP访问的“生产”配置中重新启动。