Докеры RabbitMQ настойчивость

RabbitMQ в данных docker los после удаления контейнера без объема

Мой Dockerfile:

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

Мой сценарий запуска:

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

После удаления контейнера все данные потеряны.

Как настроить rabbitmq в докере с постоянными данными?

Ответы

Ответ 1

  Rabbitmq использует имя хоста как часть имени папки в mnesia каталог. Может быть, добавить --hostname some-rabbit в свой докер?

У меня была та же проблема, и я нашел ответ здесь

Ответ 2

TL; DR

Не слишком много копался в этом, но кажется, что самый простой способ сделать это - изменить hostname, как упоминал Педро выше.

БОЛЬШЕ ИНФОРМАЦИИ:

Использование RABBITMQ_NODENAME

Если вы хотите отредактировать переменную RABBITMQ_NODENAME через Docker, похоже, вам также нужно добавить hostname, поскольку имена хостов Docker генерируются в виде случайных хэшей.

Если вы измените переменную RABBITMQ_NODENAME на статическую, например, my-rabbit, RabbitMQ выдаст что-то вроде ошибки "nxdomain not found", потому что он ищет что-то вроде
[email protected]<docker_hostname_hash>. Если вы знаете имя хоста Docker и можете автоматически ввести его в значение RABBITMQ_NODENAME, то [email protected]<docker_hostname_hash>, я думаю, это сработает.


UPDATE

Я ранее сказал,

Если вы знаете имя хоста Docker и можете автоматически ввести его в значение RABBITMQ_NODENAME, то [email protected]<docker_hostname_hash>, я думаю, это сработает.

Это не будет работать так, как описано, потому что имя хоста докера по умолчанию генерируется случайным образом при запуске, если оно не назначено явно. На самом деле препятствием было бы убедиться, что вы используете ТОЧНОЕ ЖЕ <docker_hostname_hash> в качестве исходного запуска, чтобы каталог данных был выбран правильно. Это было бы трудно реализовать динамически/надежно. Было бы проще использовать явное имя хоста, как описано ниже.


Альтернативой может быть установка для hostname значения, которое вы выберете - скажем, app-messaging - И ТАКЖЕ установите для переменной RABBITMQ_NODENAME что-то вроде [email protected]. Таким образом, вы контролируете полное имя узла, которое будет использоваться в каталоге данных.

Использование имени хоста

(Рекомендуется)

Тем не менее, если у вас нет причины НЕ изменить имя хоста, изменение только имени хоста - это самый простой способ гарантировать, что ваши данные будут монтироваться в одну и ту же точку каждый раз.

Я использую следующий файл Docker Compose для успешного сохранения настроек между запусками.

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

Это создает каталог data рядом с моим файлом compose и сохраняет настройку RabbitMQ следующим образом:

./data/
  [email protected]/
  [email protected]/
  [email protected]
  [email protected]_flags