docker rabbitmq主机名问题

docker rabbitmq主机名问题,rabbitmq,docker,Rabbitmq,Docker,我正在使用Dockerfile构建一个映像,我想在安装后立即将用户添加到RabbitMQ。问题是,在构建期间,docker容器的主机名与我运行结果映像时的主机名不同。RabbitMQ失去了该用户;由于更改了主机名,它使用了另一个数据库 我无法从容器中更改/etc/hosts和/etc/hostname文件,并且看起来RabbitMQ没有选择我对RabbitMQ\u NODENAME和hostname变量所做的更改 我发现唯一有效的方法是在启动RabbitMQ代理之前运行以下命令: echo "N

我正在使用Dockerfile构建一个映像,我想在安装后立即将用户添加到RabbitMQ。问题是,在构建期间,docker容器的主机名与我运行结果映像时的主机名不同。RabbitMQ失去了该用户;由于更改了主机名,它使用了另一个数据库

我无法从容器中更改
/etc/hosts
/etc/hostname
文件,并且看起来RabbitMQ没有选择我对
RabbitMQ\u NODENAME
hostname
变量所做的更改

我发现唯一有效的方法是在启动RabbitMQ代理之前运行以下命令:

echo "NODENAME=rabbit@localhost" >> /etc/rabbitmq/rabbitmq.conf.d/ewos.conf
但是,我必须始终使用更改的主机名运行docker映像

docker run -h="localhost" image

有什么办法吗?也许解决方案是将用户添加到RabbitMQ,而不是在构建时,而是在映像运行时?

是的,我建议在容器首次运行时添加用户


与直接启动RabbitMQ不同,您可以运行一个负责所有设置的包装器脚本,然后启动RabbitMQ。如果包装器脚本的最后一步是流程启动,请记住,您可以使用
exec
,以便新流程替换脚本本身。

以下是如何从Dockerfile正确配置的示例:

ENV HOSTNAME localhost

RUN /etc/init.d/rabbitmq-server start ; rabbitmqctl add_vhost /test; /etc/init.d/rabbitmq-server stop
这是记住你的配置。

我就是这样做的

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
安装rabbitmq.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
#!/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

还有一个问题:当我添加一个用户时,在停止RabbitMQ之后,添加的用户不会被持久化。在RabbitMQ stop命令之前添加一点
sleep 3
,解决了这个问题。这不是解决方案,因为映像应该从docker文件生成,而不是每次从docker映像进行部署时都必须运行容器来设置。@Rubycut您是对的。你测试过了吗,你的答案在下面?直到现在,我还没有看到命令执行以分号分隔。您是否遇到了像我上面所做的那样持久化配置的问题?是的,我上周在Rabbitmq的最新版本和docker的最新版本上使用了它。分号可以很好地工作,如果行太长,您甚至可以使用\转到下一行。您还可以使用&&而不是分号。是的,在我更改主机名之前,我一直存在问题,现在一切都被正确地持久化了。似乎工作正常。但不确定调用节点localhost的含义。