我有一个自定义的Rabbitmq映像,正在与docker-compose(3.7)配合使用以启动docker集群。这是必要的,因为尝试在docker swarm中部署集群时存在一些特殊问题。该映像具有在主要节点和次要节点上运行的shell脚本,并进行了运行集群所需的修改。这涉及到停止rabbitmq并运行rabbitmqctl命令以在两个节点之间创建集群。直到我尝试添加运行状况检查,此配置才能正常工作。我尝试将其添加到图像中并将其添加到撰写文件中。两者都会导致映像崩溃并不断重启。我有以下shell脚本被复制到图像中:
#!/bin/bash
set -eo pipefail
# A RabbitMQ node is considered healthy if all the below are true:
# * the rabbit app finished booting & it's running
# * there are no alarms
# * there is at least 1 active listener
rabbitmqctl eval '
{ true, rabbit_app_booted_and_running } = { rabbit:is_booted(node()), rabbit_app_booted_and_running },
{ [], no_alarms } = { rabbit:alarms(), no_alarms },
[] /= rabbit_networking:active_listeners(),
rabbitmq_node_is_healthy.
' || exit 1
在已经运行的映像上,它可以工作并产生正确的结果。 我尝试了在撰写文件中进行流式处理:
healthcheck:
interval: 60s
timeout: 60s
retries: 10
start_period: 600s
test: ["CMD", "docker-healthcheck"]
似乎start_period
被完全忽略了。我可以立即看到错误的健康状况。我还尝试了以下本机Rabbitmq诊断命令:
rabbitmq-diagnostics -q check_running && rabbitmq-diagnostics -q check_local_alarms
这奇怪地失败了,并显示了“无法找到rabbitmq-诊断”错误,尽管该程序肯定已经在运行了。我可以在已经运行的容器中成功执行命令。
如果我创建的容器没有运行状况检查,然后在命令行中添加以下内容:
docker service update --health-cmd docker-healthcheck --health-interval 60s --health-timeout 60s --health-retries 10 [container id]
它标志着容器健康。因此它可以工作,但不能在启动配置中使用。在我看来,健康检查应在10分钟后才能开始。我使用start_period
参数等待一切启动的时间似乎并不重要,它仍然会导致容器失败。
这是一个错误还是start_period
的工作方式有些神秘?
其他人都有这个问题吗?