我使用Dockerfile构建一个图像,我想在安装后立即将用户添加到RabbitMQ。问题是,在构建期间,docker容器的主机名与运行结果映像时不同。 RabbitMQ失去了那个用户;因为更改了主机名,它使用另一个DB。
我不会更改容器内的/etc/hosts
和/etc/hostname
文件,并且看起来RabbitMQ没有选择我对RABBITMQ_NODENAME
和HOSTNAME
变量的更改。
我发现唯一有效的是在启动RabbitMQ代理之前运行它:
echo "NODENAME=rabbit@localhost" >> /etc/rabbitmq/rabbitmq.conf.d/ewos.conf
但是我必须一直运行更改主机名的docker镜像。
docker run -h="localhost" image
关于可以做些什么的任何想法?也许解决方案是将用户添加到RabbitMQ而不是在构建上但在图像上运行?
答案 0 :(得分:6)
这里是如何正确配置Dockerfile的示例:
ENV HOSTNAME localhost
RUN /etc/init.d/rabbitmq-server start ; rabbitmqctl add_vhost /test; /etc/init.d/rabbitmq-server stop
这是记住你的配置。
答案 1 :(得分:1)
是的,我建议在容器第一次运行时添加用户。
您可以运行一个包装器脚本来处理所有设置,然后启动RabbitMQ,而不是直接启动RabbitMQ。如果包装器脚本的最后一步是进程启动,请记住您可以使用exec
以便新进程替换脚本本身。
答案 2 :(得分:1)
这就是我做到的。
<强> Dockerfile 强>
FROM debian:jessie
MAINTAINER Francesco Casula <fra.casula@gmail.com>
VOLUME ["/var/www"]
WORKDIR /var/www
ENV HOSTNAME my-docker
ENV RABBITMQ_NODENAME rabbit@my-docker
COPY scripts /root/scripts
RUN /bin/bash /root/scripts/os-setup.bash && \
/bin/bash /root/scripts/install-rabbitmq.bash
CMD /etc/init.d/rabbitmq-server start && \
/bin/bash
<强> OS-setup.bash 强>
#!/bin/bash
echo "127.0.0.1 localhost" > /etc/hosts
echo "127.0.1.1 my-docker" >> /etc/hosts
echo "my-docker" > /etc/hostname
安装-rabbitmq.bash 强>
#!/bin/bash
echo "NODENAME=rabbit@my-docker" > /etc/rabbitmq/rabbitmq-env.conf
echo 'deb http://www.rabbitmq.com/debian/ testing main' | tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | apt-key add -
apt-get update
cd ~
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server_3.6.5-1_all.deb
dpkg -i rabbitmq-server_3.6.5-1_all.deb
apt-get install -f -y
/etc/init.d/rabbitmq-server start
sleep 3
rabbitmq-plugins enable amqp_client mochiweb rabbitmq_management rabbitmq_management_agent \
rabbitmq_management_visualiser rabbitmq_web_dispatch webmachine
rabbitmqctl delete_user guest
rabbitmqctl add_user bunny password
rabbitmqctl set_user_tags bunny administrator
rabbitmqctl delete_vhost /
rabbitmqctl add_vhost symfony_prod
rabbitmqctl set_permissions -p symfony_prod bunny ".*" ".*" ".*"
rabbitmqctl add_vhost symfony_dev
rabbitmqctl set_permissions -p symfony_dev bunny ".*" ".*" ".*"
rabbitmqctl add_vhost symfony_test
rabbitmqctl set_permissions -p symfony_test bunny ".*" ".*" ".*"
/etc/init.d/rabbitmq-server restart
IS_RABBIT_INSTALLED=`rabbitmqctl status | grep RabbitMQ | grep "3\.6\.5" | wc -l`
if [ "$IS_RABBIT_INSTALLED" = "0" ]; then
exit 1
fi
IS_RABBIT_CONFIGURED=`rabbitmqctl list_users | grep bunny | grep "administrator" | wc -l`
if [ "$IS_RABBIT_CONFIGURED" = "0" ]; then
exit 1
fi
不要忘记通过使用-h
标志指定正确的主机来运行容器:
docker run -h my-docker -it --name=my-docker -v $(pwd)/htdocs:/var/www my-docker
答案 3 :(得分:0)
唯一对我有帮助的是将 MNESIA_BASE 属性的 rabbitmq-env.conf 中的默认值更改为 MNESIA_BASE=/data 和在启动服务器并添加用户之前,我在 Dockerfile 中添加了此命令 RUN mkdir /data。