如何在Docker容器中配置rabbitmq.config?

24

我正在使用官方的RabbitMQ Docker镜像(https://hub.docker.com/_/rabbitmq/)。

我尝试在容器运行后编辑容器内的rabbitmq.config文件:

docker exec -it <container-id> /bin/bash

然而,这似乎对运行在容器中的RabbitMQ服务器没有影响。重新启动容器显然也没用,因为Docker会启动一个全新的实例。

所以,我假设配置rabbitmq.config的唯一方法是在容器启动运行之前设置,通过使用镜像支持的环境变量部分完成。

不幸的是,并非所有的配置选项都受环境变量的支持。例如,我想在rabbitmq.config中设置{auth_mechanisms, ['PLAIN', 'AMQPLAIN', 'EXTERNAL']}

随后,我发现了RABBITMQ_CONFIG_FILE环境变量,可以让我指向我想要用作配置文件的文件。然而,我尝试了以下操作,但都没有成功:

docker service create --name rabbitmq --network rabbitnet \
-e RABBITMQ_ERLANG_COOKIE='mycookie' --hostname = "{{Service.Name}}{{.Task.Slot}}" \
--mount type=bind,source=/root/mounted,destination=/root \
-e RABBITMQ_CONFIG_FILE=/root/rabbitmq.config rabbitmq

默认的rabbitmq.config文件包含:

[ { rabbit, [ { loopback_users, [ ] } ] } ]

这是容器启动后其中所包含的内容。

在Docker容器内部配置rabbitmq.config的最佳方式是什么?

2个回答

34

配置文件位于/etc/rabbitmq/rabbitmq.config,因此如果您使用类似下面这样的内容挂载自己的配置文件(我在此处使用docker-compose设置镜像)

volumes:
- ./conf/myrabbit.conf:/etc/rabbitmq/rabbitmq.config

应该可以了。

如果您遇到配置文件被创建为目录的问题,请尝试使用绝对路径


4
我正在尝试通过使用COPY ./rabbitmq.config /etc/rabbitmq/rabbitmq.configCMD ["rabbitmq-server"]将配置文件添加到我的自定义镜像中,但似乎我添加的文件被默认配置文件覆盖了。可能是因为默认配置文件是由"rabbit-server"命令创建的。 - Kirill G.
1
是的,文件会被 Rabbit 覆盖,并且一些值,如 default_permissions 会被删除。非常令人恼火。 - Jimbali
1
根据该镜像的docker-entrypoint.sh,发生这种情况是因为您提供了以RABBITMQ_ <something>开头的环境变量。如果您最初将所有内容放在自己的配置中,并且不从环境中提取任何内容,则不会覆盖它。尽管将密码保存在配置文件中并发送到git看起来更糟糕。 - Michael A.
2
对于旧版 Erlang,使用以下配置:- ./conf/myrabbit.conf:/etc/rabbitmq/rabbitmq.config 对于新版,请使用以下配置:- ./conf/myrabbit.conf:/etc/rabbitmq/rabbitmq.conf - Gokberk Yar
在我的情况下,Docker容器内配置文件的位置是/etc/rabbitmq/conf.d/my_config.conf - Niv

2

我可以通过以下 bash 脚本使用挂载的配置运行 RabbitMQ:

#RabbitMQ props
env=dev
rabbitmq_name=dev_rabbitmq
rabbitmq_port=5672

#RabbitMQ container
if [ "$(docker ps -aq -f name=${rabbitmq_name})" ]; then
    echo Cleanup the existed ${rabbitmq_name} container
    docker stop ${rabbitmq_name} && docker rm ${rabbitmq_name} 
    echo Create and start new ${rabbitmq_name} container
    docker run --name ${rabbitmq_name} -d -p ${rabbitmq_port}:15672 -v $PWD/rabbitmq/${env}/data:/var/lib/rabbitmq:rw -v $PWD/rabbitmq/${env}/definitions.json:/opt/definitions.json:ro -v $PWD/rabbitmq/${env}/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro rabbitmq:3-management
else
    echo Create and start new ${rabbitmq_name} container
    docker run --name ${rabbitmq_name} -d -p ${rabbitmq_port}:15672 -v $PWD/rabbitmq/${env}/data:/var/lib/rabbitmq:rw -v $PWD/rabbitmq/${env}/definitions.json:/opt/definitions.json:ro -v $PWD/rabbitmq/${env}/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro rabbitmq:3-management    
fi

我在我的 rabbitmq/dev 目录下也有以下的 config 文件:

definitions.json

{
        "rabbit_version": "3.7.3",
        "users": [{
            "name": "welib",
            "password_hash": "su55YoHBYdenGuMVUvMERIyUAqJoBKeknxYsGcixXf/C4rMp",
            "hashing_algorithm": "rabbit_password_hashing_sha256",
            "tags": ""
        }, {
            "name": "admin",
            "password_hash": "x5RW/n1lq35QfY7jbJaUI+lgJsZp2Ioh6P8CGkPgW3sM2/86",
            "hashing_algorithm": "rabbit_password_hashing_sha256",
            "tags": "administrator"
        }],
        "vhosts": [{
            "name": "/"
        }, {
            "name": "dev"
        }],
        "permissions": [{
            "user": "welib",
            "vhost": "dev",
            "configure": ".*",
            "write": ".*",
            "read": ".*"
        }, {
            "user": "admin",
            "vhost": "/",
            "configure": ".*",
            "write": ".*",
            "read": ".*"
        }],
        "topic_permissions": [],
        "parameters": [],
        "global_parameters": [{
            "name": "cluster_name",
            "value": "rabbit@98c821300e49"
        }],
        "policies": [],
        "queues": [],
        "exchanges": [],
        "bindings": []
    }

rabbitmq.config

[
    {rabbit, [
        {loopback_users, []},
        {vm_memory_high_watermark, 0.7},
        {vm_memory_high_watermark_paging_ratio, 0.8},
        {log_levels, [{channel, warning}, {connection, warning}, {federation, warning}, {mirroring, info}]},
        {heartbeat, 10}
    ]},
    {rabbitmq_management, [
        {load_definitions, "/opt/definitions.json"}
    ]}
].

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接