web-dev-qa-db-fra.com

Docker RabbitMQ persistance

RabbitMQ dans Docker Los Data après avoir supprimé le conteneur sans volume

Mon Dockerfile:

FROM rabbitmq:3-management
ENV RABBITMQ_HIPE_COMPILE 1
ENV RABBITMQ_ERLANG_COOKIE "123456"
ENV RABBITMQ_DEFAULT_VHOST "123456"

Mon script d'exécution:

IMAGE_NAME="service-rabbitmq"
TAG="${REGISTRY_ADDRESS}/${IMAGE_NAME}:${VERSION}"

echo $TAG

docker rm -f $IMAGE_NAME

  docker run \
    -itd \
    -v "rabbitmq_log:/var/log/rabbitmq" \
    -v "rabbitmq_data:/var/lib/rabbitmq" \
    --name "service-rabbitmq" \
    --dns=8.8.8.8 \
    -p 8080:15672 \
    $TAG

Après avoir retiré le conteneur, toutes les données sont perdues.

Comment configurer rabbitmq dans docker avec des données persistantes?

12

Rabbitmq utilise le nom d'hôte dans le nom du dossier dans le répertoire mnesia. Ajoutez peut-être un --hostname some-rabbit à votre run de docker?

J'ai eu le même problème et j'ai trouvé la réponse ici

14
Pedro Mázala

TL; DR

N'a pas fait trop beaucoup creuser à ce sujet, mais il semble que la façon la plus simple de le faire est de changer le hostname comme Pedro mentionne ci-dessus.

PLUS D'INFORMATIONS:

En utilisant RABBITMQ_NODENAME

Si vous souhaitez modifier le RABBITMQ_NODENAME variable via Docker, il semble que vous devez également ajouter un hostname puisque les noms d'hôte Docker sont générés sous forme de hachages aléatoires.

Si vous modifiez le RABBITMQ_NODENAME var à quelque chose de statique comme my-rabbit, RabbitMQ lancera quelque chose comme un "nxdomain not found" erreur car il recherche quelque chose comme
my-rabbit@<docker_hostname_hash>Si vous connaissez le nom d'hôte Docker et pouvez automatiser son extraction dans votre RABBITMQ_NODENAME valeur comme ça, my-rabbit@<docker_hostname_hash> Je crois que cela fonctionnerait.


MISE À JOUR

J'ai déjà dit,

Si vous connaissez le nom d'hôte Docker et pouvez automatiser son extraction dans votre RABBITMQ_NODENAME valeur comme ça, my-rabbit@<docker_hostname_hash> Je crois que cela fonctionnerait.

Cela ne fonctionnerait pas comme décrit précisément car le nom d'hôte du docker par défaut est généré de manière aléatoire au lancement, s'il n'est pas attribué explicitement. L'obstacle serait en fait de vous assurer que vous utilisez EXACT SAME <docker_hostname_hash> comme votre exécution d'origine afin que le répertoire de données soit récupéré correctement. Ce serait pénible à mettre en œuvre de manière dynamique/robuste. Il serait plus simple d'utiliser un nom d'hôte explicite comme décrit ci-dessous.


L'alternative serait de définir hostname sur une valeur que vous choisissez - disons, app-messaging - ET AUSSI définissez le RABBITMQ_NODENAME var à quelque chose comme rabbit@app-messaging. De cette façon, vous contrôlez le nom de nœud complet qui sera utilisé dans le répertoire de données.

Utilisation du nom d'hôte

( Recommandé )

Cela dit, sauf si vous avez une raison PAS pour changer le nom d'hôte, changer le nom d'hôte seul est le moyen le plus simple de vous assurer que vos données seront montées vers et depuis le même point à chaque fois.

J'utilise le fichier Docker Compose suivant pour conserver avec succès ma configuration entre les lancements.

version: '3'
services:
  rabbitmq:
    hostname: 'mabbit'
    image: "${ARTIFACTORY}/rabbitmq:3-management"
    ports:
      - "15672:15672"
      - "5672:5672"
    volumes:
      - "./data:/var/lib/rabbitmq/mnesia/"
    networks:
      - rabbitmq

networks:
  rabbitmq:
    driver: bridge

Cela crée un répertoire data à côté de mon fichier de composition et persiste la configuration de RabbitMQ comme suit:

./data/
  rabbit@mabbit/
  rabbit@mabbit-plugins-expand/
  [email protected]
  rabbit@mabbit-feature_flags

4
wileymab