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

时间:2014-11-06 04:47:00

标签: rabbitmq docker

我遇到了一个问题,即用户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

4 个答案:

答案 0 :(得分:16)

我知道这是一个老问题,但今天在这个问题上挣扎了几个小时,最后为我解决了这个问题: 问题似乎是由于默认主机名在每个使用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

答案 1 :(得分:0)

我做了类似的事情并且仍然存在:

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

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

答案 2 :(得分:0)

对于值得的东西,在this 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 ".*" ".*" ".*"

答案 3 :(得分:0)

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

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