RabbitMQ в Docker - создание пользователя не сохраняется

У меня проблема, когда пользователь user1 не сохраняется в контейнере, который я создал, используя следующий файл Docker. Что является причиной этого? Является ли это проблемой RabbitMQ? например Я должен явно указать, что пользователь должен быть сохранен

FROM dockerfile/rabbitmq

# Define mount points.
VOLUME ["/data/log", "/data/mnesia"]

# Define working directory.
WORKDIR /data

RUN (rabbitmq-start &) && \
  sleep 10 && \
  rabbitmqctl add_user user1 password1 && \
  rabbitmqctl set_user_tags user1 administrator && \
  rabbitmqctl set_permissions -p / user1 ".*" ".*" ".*"  && \
  sleep 10 && \
  rabbitmqctl stop && \
  sleep 10
# Define default command.
CMD ["rabbitmq-start"]

# Expose ports.
EXPOSE 5672
EXPOSE 15672

Ответ 1

Я знаю, что это старый вопрос, но в течение многих часов боролся с этой проблемой и, наконец, решил это для меня: Проблема, похоже, связана с изменением имени хоста по умолчанию в каждом новом контейнере с Docker, а RabbitMQ фактически привязывает конфигурацию к имени узла.

Я устанавливаю переменную NODENAME в файле /etc/rabbitmq/rabbitmq -env.conf перед настройкой пользователя:

# make the node name static
RUN echo '[email protected]' > /etc/rabbitmq/rabbitmq-env.conf

и теперь он работает.

Надеюсь, это поможет.

EDIT:

Вот рабочий Dockerfile (копирование файла rabbitmq-env.conf в контейнер):

FROM ubuntu:latest

RUN groupadd -r rabbitmq && useradd -r -d /var/lib/rabbitmq -m -g rabbitmq rabbitmq

# add rabbitmq repo
RUN apt-get update && \
apt-get install wget --assume-yes && \
wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc && \
sudo apt-key add rabbitmq-signing-key-public.asc && \
sed -i -e '1ideb http://www.rabbitmq.com/debian/ testing main\' /etc/apt/sources.list && \
apt-get update && \
apt-get install rabbitmq-server --assume-yes

# Enable plugins
RUN rabbitmq-plugins enable rabbitmq_management && \
rabbitmq-plugins enable rabbitmq_web_stomp && \
rabbitmq-plugins enable rabbitmq_mqtt

# expose ports
# Management
EXPOSE  15672
# Web-STOMP plugin
EXPOSE  15674
# MQTT:
EXPOSE  1883


# configure RabbitMQ
COPY ["rabbitmq-env.conf", "/etc/rabbitmq/rabbitmq-env.conf"]
RUN chmod 755 /etc/rabbitmq/rabbitmq-env.conf

# Create users for the apps
COPY ["rabbitmq-setup.sh", "/tmp/rabbitmq/rabbitmq-setup.sh"]
RUN mkdir /var/run/rabbitmq && \
chmod -R 755 /var/run/rabbitmq && \
chown -R rabbitmq:rabbitmq /var/run/rabbitmq && \
service rabbitmq-server start && \
sh /tmp/rabbitmq/rabbitmq-setup.sh && \
rm /tmp/rabbitmq/rabbitmq-setup.sh && \
service rabbitmq-server stop

# start rabbitmq
USER rabbitmq
CMD ["rabbitmq-server", "start"]

Мой файл rabbitmq-env.conf:

[email protected]

Мой rabbitmq-setup.sh:

rabbitmqctl add_vhost myvhost && rabbitmqctl add_user myuser mypasswd && rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*" && rabbitmqctl set_user_tags myuser administrator

Ответ 2

Я делаю что-то подобное, и оно сохраняется:

RUN service rabbitmq-server start ; \
    rabbitmqctl add_vhost /sensu ; \
    rabbitmqctl add_user sensu sensu ; \
    rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*" ; \
    service rabbitmq-server stop

Вы уверены, что процесс создания происходит в первую очередь? Спит и подоболочки не делают это очевидным.

Ответ 3

Для чего стоит нечто подобное в этом файле dockerfile, но я не могу заставить его продолжать:

RUN /usr/sbin/rabbitmq-server -detached && \
    sleep 5 && \
    rabbitmqctl add_user bunnyuser my_pass1 && \
    rabbitmqctl add_user bunny-admin my_pass2 && \
    rabbitmqctl set_user_tags bunny-admin administrator && \
    rabbitmqctl set_permissions -p / bunnyuser ".*" ".*" ".*"

Ответ 4

Поскольку у многих людей все еще есть эта проблема (включая меня), я сделал это:

При создании скопируйте RabbitMQ database_dir в/var/lib/rabbitmq/mnesia/rabbit\@$(имя хоста) в /root (все в /root остается в памяти) после настройки всех пользователей.

Во время выполнения скопируйте каталог базы данных из /root в/var/lib/rabbitmq/mnesia.

Только недостатки: изменения, внесенные в базу данных в RabbitMQ, будут reset во время выполнения. Я не нашел другого способа сделать это с помощью docker-compose.

Configure.sh(как команда RUN в файле Docker):

echo "[email protected]" > /etc/rabbitmq/rabbitmq-env.conf
echo "127.0.0.1 message-bus" >> /etc/hosts #prevents error that 'message-bus' node doesnt exist (this doesnt persist in /etc/hosts)
rabbitmqctl add user ... #etc
rabbitmqctl stop
mkdir /root/rabbitmq_database
cp -R /var/lib/rabbitmq/mnesia/rabbit\@message-bus/* /root/rabbitmq_database

Runtime.sh(как точка входа в файл Docker):

#copy database back from /root
mkdir -p /var/lib/rabbitmq/mnesia/rabbit\@message-bus
cp -R /root/rabbitmq_database/* /var/lib/rabbitmq/mnesia/rabbit\@message-bus
rabbitmq-server