docker - 初始化容器以等待 rabbit-mq 准备就绪

标签 docker kubernetes rabbitmq rabbitmqctl

我在 docker-library/healthcheck 看到了 RabbitMQ 的 docker healthcheck 示例.

我想对我的 Kubernetes 部署应用类似的机制,以等待 Rabbit 部署准备就绪。我正在用 MongoDB 做类似的事情,使用一个容器,用一些 ping 命令忙等待 mongo。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-1
  template:
    metadata:
      labels:
        app: app-1
    spec:
      initContainers:
        - name: wait-for-mongo
          image: gcr.io/app-1/tools/mongo-ping
      containers:
        - name: app-1-service
          image: gcr.io/app-1/service
          ...

但是,当我尝试构建这样一个 init 容器时,我找不到关于如何从其集群外部查询兔子健康状况的任何解决方案。

最佳答案

改编自此 example ,正如@Hanx 所建议的:
文件

FROM python:3-alpine

ENV RABBIT_HOST="my-rabbit"
ENV RABBIT_VHOST="vhost"
ENV RABBIT_USERNAME="root"

RUN pip install pika

COPY check_rabbitmq_connection.py /check_rabbitmq_connection.py
RUN chmod +x /check_rabbitmq_connection.py

CMD ["sh", "-c", "python /check_rabbitmq_connection.py --host $RABBIT_HOST --username $RABBIT_USERNAME --password $RABBIT_PASSWORD --virtual_host $RABBIT_VHOST"]
check_rabbitmq_connection.py
#!/usr/bin/env python3
# Check connection to the RabbitMQ server
# Source: https://blog.sleeplessbeastie.eu/2017/07/10/how-to-check-connection-to-the-rabbitmq-message-broker/

import argparse
import time
import pika

# define and parse command-line options
parser = argparse.ArgumentParser(description='Check connection to RabbitMQ server')
parser.add_argument('--host', required=True, help='Define RabbitMQ server hostname')
parser.add_argument('--virtual_host', default='/', help='Define virtual host')
parser.add_argument('--port', type=int, default=5672, help='Define port (default: %(default)s)')
parser.add_argument('--username', default='guest', help='Define username (default: %(default)s)')
parser.add_argument('--password', default='guest', help='Define password (default: %(default)s)')
args = vars(parser.parse_args())

print(args)

# set amqp credentials
credentials = pika.PlainCredentials(args['username'], args['password'])
# set amqp connection parameters
parameters = pika.ConnectionParameters(host=args['host'], port=args['port'], virtual_host=args['virtual_host'], credentials=credentials)

# try to establish connection and check its status
while True:
    try:
        connection = pika.BlockingConnection(parameters)
        if connection.is_open:
            print('OK')
            connection.close()
            exit(0)
    except Exception as error:
        raise
        print('No connection yet:', error.__class__.__name__)
        time.sleep(5)
构建并运行:
docker build -t rabbit-ping .

docker run --rm -it \
    --name rabbit-ping \
    --net=my-net \
    -e RABBIT_PASSWORD="<rabbit password>" \
    rabbit-ping
并在 deployment.yaml 中:
apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      initContainers:
        - name: wait-for-rabbit
          image: gcr.io/my-org/rabbit-ping
          env:
            - name: RABBIT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: rabbit
                  key: rabbit-password
      containers:
        ...

关于docker - 初始化容器以等待 rabbit-mq 准备就绪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58206351/

相关文章:

在 Docker 容器中使用 Gunicorn 运行时,Python 不解析主机(超时)(weasyprint 需要这样做)

docker - Kubernetes-需要帮助-失败的安装3分38秒

php - mysql错误: Mysql server has gone away

python - paho MQTT 不响应 docker 容器

node.js - Windows 10下Docker上的Nodejs开发

kubernetes - 如何在GCP中快速备份和还原kubernetes集群

python - 如何在 Google 应用引擎上部署 Celery Worker

javascript - 将嵌套对象数组转换为 Nodejs Buffer

java - MacOS 系统上的 MySQL Docker 容器 INFILE/INTO OUTFILE 语句

amazon-web-services - 在不同的kubernetes托管提供商之间切换是否容易?