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