问题 Docker中的RabbitMQ - 用户创建不会持久化


我有一个用户问题 user1 没有持久化在我使用以下Dockerfile创建的容器中。这是什么原因?这是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

870
2017-11-06 04:46


起源

你找到了解决这个问题的方法吗?我正在寻找同样的事情。 - Marco
不,我从来没有。 - lolski
16个upvotes的答案是否可以解决您的问题? - qodeninja


答案:


我知道这是一个老问题,但今天在这个问题上挣扎了几个小时,最后为我解决了这个问题: 问题似乎是由于默认主机名在每个使用Docker的新容器中都发生了变化,而RabbitMQ实际上将配置绑定到主机名。

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

# 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

16
2018-05-22 20:13



你能分享你的Dockerfile吗?我正在寻找同样问题的解决方案。我的用户不会坚持下去。 - Marco
@Marco:当然,看看我编辑的答案;)你可能不得不暴露你需要的端口并启用/禁用插件。 - Ben
请注意,如果使用Windows生成文件,则需要小心。确保所有文件仅使用LF行结尾。我只需要1个多小时就能发现rabbitmq正在寻找名为“localhost \ R”的主机名(rabbitmq-env.conf)。 - BlaM


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

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

您确定创建过程首先发生吗?睡眠和子弹都不会显而易见。


0
2017-11-06 11:38



是的,我尝试使用您的代码构建图像,并检查用户列表 docker exec -ti rmq rabbitmqctl list_users 并且找不到新创建的用户。我错过了什么吗? - lolski
对不起,我不是一个兔子专家。我试着在rabbitmq日志中搜索提示。 - seanmcl


值得的是,类似的事情已经完成了 这个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 ".*" ".*" ".*"

0
2018-03-12 14:17



你好。您是否找到了允许存储多个accoundt和权限的正确Dockerfile? - Meiram Chuzhenbayev


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

建造,在配置所有用户后,将/ 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

0
2017-11-02 12:41