RabbitMQ in Docker - user creation not persisted RabbitMQ in Docker - user creation not persisted docker docker

RabbitMQ in Docker - user creation not persisted


I know it's an old question, but struggled for hours with this problem today and finally solved it for me: The issue seems to be due to the default hostname changing at every new container with Docker, and RabbitMQ actually binds the configuration to the host name.

I set the NODENAME variable in /etc/rabbitmq/rabbitmq-env.conf before setting up the user:

# make the node name staticRUN echo 'NODENAME=rabbit@localhost' > /etc/rabbitmq/rabbitmq-env.conf

and now it works.

Hope it can help.

EDIT:

Here is a working Dockerfile (copying a rabbitmq-env.conf file to the container):

FROM ubuntu:latestRUN groupadd -r rabbitmq && useradd -r -d /var/lib/rabbitmq -m -g rabbitmq rabbitmq# add rabbitmq repoRUN 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 pluginsRUN rabbitmq-plugins enable rabbitmq_management && \rabbitmq-plugins enable rabbitmq_web_stomp && \rabbitmq-plugins enable rabbitmq_mqtt# expose ports# ManagementEXPOSE  15672# Web-STOMP pluginEXPOSE  15674# MQTT:EXPOSE  1883# configure RabbitMQCOPY ["rabbitmq-env.conf", "/etc/rabbitmq/rabbitmq-env.conf"]RUN chmod 755 /etc/rabbitmq/rabbitmq-env.conf# Create users for the appsCOPY ["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 rabbitmqUSER rabbitmqCMD ["rabbitmq-server", "start"]

My rabbitmq-env.conf file:

NODENAME=rabbimq@localhost

My rabbitmq-setup.sh:

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


I do something similar and it persists:

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

Are you sure the creation process occurs in the first place? The sleeps and subshells don't make it obvious.


Because many people are still having this problem (including me), what I did was:

At building, copy the RabbitMQ database_dir at /var/lib/rabbitmq/mnesia/rabbit\@$(hostname) to /root (everything in /root stays persisted) after configuring all users.

At runtime, copy the database dir back from /root to /var/lib/rabbitmq/mnesia.

Only disadvantages: changes made to the database in RabbitMQ will be reset at runtime. I found no other way to do this with docker-compose however.

Configure.sh (as RUN command in Dockerfile):

echo "NODENAME=rabbit@message-bus" > /etc/rabbitmq/rabbitmq-env.confecho "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 ... #etcrabbitmqctl stopmkdir /root/rabbitmq_databasecp -R /var/lib/rabbitmq/mnesia/rabbit\@message-bus/* /root/rabbitmq_database

Runtime.sh (as entrypoint in Dockerfile):

#copy database back from /rootmkdir -p /var/lib/rabbitmq/mnesia/rabbit\@message-buscp -R /root/rabbitmq_database/* /var/lib/rabbitmq/mnesia/rabbit\@message-busrabbitmq-server