我正在尝试使用 RabbitMQ 的 docker 镜像:
rabbitmq:3.11.6
与 docker compose。一切都按预期工作,但现在我必须更改 RabbitMQ 的默认设置。
根据 RabbitMQ 的文档,在这种情况下,设置是从
/etc/rabbitmq/conf.d
目录解析的。最简单的方法是向图像中注入一个文件,这样它就会在启动时由 RabbitMQ 加载。为了测试它,我根据 rabbitmq:3.11.6
添加新文件制作了一个新图像,它工作正常:
FROM rabbitmq:3.11.6
COPY --chown=rabbitmq:rabbitmq --chmod=0664 rabbitmq.conf /etc/rabbitmq/conf.d/20-consumer_timeout.conf
有了这个,额外的文件在启动时被 RabbitMQ 成功加载:
rabbit-1 | Config file(s): /etc/rabbitmq/conf.d/10-defaults.conf
rabbit-1 | /etc/rabbitmq/conf.d/20-consumer_timeout.conf
rabbit-1 | /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf
但是,如果我能避免仅仅为了向图像注入额外文件而构建新图像,那将非常方便。我找到了撰写文件参考的 config 部分,但我无法让它与
docker compose up
命令一起工作。好像文件是在RabbitMQ服务器启动后注入到容器中的,因为它并没有加载它。此外,UID、GID 和权限设置将被忽略。
compose文件的配置机制可以和
docker compose up
一起使用吗?
我在 Windows 11 上使用 WSL2 和 Docker Desktop v4.17.0:
Docker 版本 23.0.0,构建 e92dd87
Docker Compose 版本 v2.15.1
为了在不构建 RabbitMQ 的新图像的情况下使用撰写文件,我添加了一个配置部分并将其用于相关服务(删除了不相关的部分):
version: "3.9"
configs:
rabbitmq_consumer_timeout_conf:
file: ./docker/rabbit/rabbitmq.conf
services:
manager: {...}
worker: {...}
rabbit:
image: "rabbitmq:3.11.6"
hostname: rabbit
configs:
- source: rabbitmq_consumer_timeout_conf
target: /etc/rabbitmq/conf.d/20-consumer_timeout.conf
uid: "999"
gid: "999"
mode: 0440
不幸的是,如果此配置以
docker compose up
启动,RabbitMQ 不会列出额外的配置文件:
rabbit-1 | Config file(s): /etc/rabbitmq/conf.d/10-defaults.conf
rabbit-1 | /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf
/etc/rabbitmq/conf.d/20-consumer_timeout.conf
文件存在于正在运行的容器中,但是:
UID 和 GID 都是 1000,这是来自主机(WSL2)的值,因此忽略
uid
和gid
设置。
模式为 777,这也是主机系统 (/mnt/c/...) 的值,因此
mode
设置也被忽略。
我修改了提到的Dockerfile,看看RabbitMQ是否会加载带有上述
uid
,gid
和mode
的配置文件并且它成功加载了它,所以似乎配置文件没有及时复制到那里。