Docker中的RabbitMQ – 用户创build不会持久

我遇到了一个问题,用户user1没有被保存在我使用下面的Dockerfile创build的容器中。 这是什么原因? 这是一个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 

我知道这是一个老问题,但今天这个问题挣扎几个小时,终于解决了这个问题:这个问题似乎是由于在每个新的容器与Docker更改默认的主机名,RabbitMQ实际上绑定configuration到主机名。

在设置用户之前,我在/etc/rabbitmq/rabbitmq-env.conf中设置了NODENAMEvariables:

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

现在它工作。

希望它可以帮助。

编辑:

这是一个可用的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文件:

 NODENAME=rabbimq@localhost 

我的rabbitmq-setup.sh

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

我做了类似的事情,它仍然存在:

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

你确定创build过程是否在第一位? 睡觉和子壳不明显。

值得一提的是,在这个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 ".*" ".*" ".*" 

因为很多人还有这个问题(包括我),我所做的是:

构build完成后 ,在configuration完所有用户之后,将/ var / lib / rabbitmq / mnesia / rabbit \ @ $(hostname)处的RabbitMQ database_dir复制到/ root(/ root中的所有内容保留)。

运行时 ,将数据库目录从/ root复制到/ var / lib / rabbitmq / mnesia。

只有缺点:在RabbitMQ中对数据库所做的更改将在运行时重置。 然而,我发现没有其他的方式来做这个docker-compose。

Configure.sh(作为Dockerfile中的RUN命令):

 echo "NODENAME=rabbit@message-bus" > /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(作为Dockerfile中的入口点):

 #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